IPB

Bienvenue invité ( Connexion | Inscription )

> Programmation

Il est interdit de poster directement à la racine de ce forum.
Veuillez créer votre topic dans le sous-forum approprié.

 
Reply to this topicStart new topic
> Question static / pas static en java, je ne sais pas comment corriger...
Options
arnaudp
posté 31 Jan 2004, 18:54
Message #1


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 814
Inscrit : 11 Oct 2002
Lieu : Nantes
Membre no 4 083



J'ai une erreur en compil java super classique et que je crois comprendre... sauf que je ne sais pas comment corriger :

L'erreur :
MyFrame.java:103: non-static method getColumns() cannot be referenced from a static context


Le code :

public class MyFrame extends Frame implements ActionListener {
//description des champs...
setLayout(new GridLayout(8, 3));
nbCol=GridLayout.getColumns();
pack();
show();

}

DecimalFormat TempConv = new DecimalFormat("####0.00");

// public void textValueChanged (TextEvent e) : gestion du texte
public void actionPerformed (ActionEvent e)
{
blal bla...

}

Je comprend que je fais appel à une méthode public à l'intérieur de l'objet que j'ai créé mais comment programmer pour obtenir le nombre de col de ma frame ?

(NB : Objet du code essayer de comprendre pourquoi ma grille n'affiche que 2 colonnes alors que j'en demande 3... Ben oui quoi.. j'débute en java.)
Merci d'avance.


--------------------

Fan d'apple depuis ... 1987. Donc pas parmi les premiers, mais ça fait tout de même un moment.

la vraie nouveauté, c'est ce qui ne vieillit pas malgré le temps. (Muriel Barbery)
Membre n° 87 du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
Go to the top of the page
 
+Quote Post
Bac's
posté 31 Jan 2004, 19:33
Message #2


Tendance cubiste
*****

Groupe : Membres
Messages : 1 595
Inscrit : 17 Sep 2003
Lieu : Là où ce qui tombe des arbres à l'automne commence par 'F' et finit par 'n'
Membre no 9 643



Je pense que le problème vient du fait que la méthode getColumns() s'applique à un objet (elle n'est pas statique).

Essaie qque chose du style (excuse-moi si erreur il y a, je suis plus familier avec C++ que Java) :
CODE
zeLayout = new GridLayout(8, 3);
setLayout(zeLayout);
nbCol= zeLayout.getColumns();


Ce message a été modifié par Bacs - 31 Jan 2004, 19:38.


--------------------
G5 1,6GHz 1 270Mo RAM OS/X 10.4.1 + STHome Hyper-Bidouillé

C'est à force de rater que l'on finit par réussir. Devise Shadok.


[Editus moderatus]Plus de bannières merci... [Editus Bacsus]Oui chef, bien chef !
Go to the top of the page
 
+Quote Post
arnaudp
posté 31 Jan 2004, 19:43
Message #3


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 814
Inscrit : 11 Oct 2002
Lieu : Nantes
Membre no 4 083



J'ai fait le test et il n'est pas plus concluant. Merci quand même !!

Au passage, j'ai réglé mon pb d'origine !! comme quoi tous les chemins mènent à la résolution des pb de programmation ! Cela dit, la question de ce forum m'interesse en tant que telle !


--------------------

Fan d'apple depuis ... 1987. Donc pas parmi les premiers, mais ça fait tout de même un moment.

la vraie nouveauté, c'est ce qui ne vieillit pas malgré le temps. (Muriel Barbery)
Membre n° 87 du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
Go to the top of the page
 
+Quote Post
mpergand
posté 31 Jan 2004, 21:06
Message #4


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 198
Inscrit : 8 Oct 2003
Membre no 10 220



Généralement cette erreur survient lorsque l'on essaye dans une méthode static d'accéder à une variable ou une autre méthode non static de la même classe(dans un contexte static tu ne peux accéder qu'a des éléments static).
Dans ton cas getColumns n'est pas une méthode static de la classe GridLayout, tu ne peux donc l'appeler qu'a partir d'une instance de GridLayout ex: myGrid.getColumns(), comme l'a dit Bacs.

Ce message a été modifié par mpergand - 31 Jan 2004, 21:09.
Go to the top of the page
 
+Quote Post
arnaudp
posté 1 Feb 2004, 09:39
Message #5


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 814
Inscrit : 11 Oct 2002
Lieu : Nantes
Membre no 4 083



Merci pour vos explications...

Mais dans le code suivant de Bacs, similaire au mien:

zeLayout = new GridLayout(8, 3);
setLayout(zeLayout);
nbCol= zeLayout.getColumns();


Comment je dois déclarer zeLayout ? c'est un objet de quelle classe ?
J'ai essayé Layout mais cela n'a rien donné...

Merci !


Ha ben... je crois que j'ai trouvé : GridLayout.... bien sûr, puissque c'est une classe. sad.gif

Ce message a été modifié par arnaudp - 1 Feb 2004, 10:01.


--------------------

Fan d'apple depuis ... 1987. Donc pas parmi les premiers, mais ça fait tout de même un moment.

la vraie nouveauté, c'est ce qui ne vieillit pas malgré le temps. (Muriel Barbery)
Membre n° 87 du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
Go to the top of the page
 
+Quote Post
mpergand
posté 1 Feb 2004, 10:04
Message #6


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 198
Inscrit : 8 Oct 2003
Membre no 10 220



Une petite recherche avec Google devrait te permettre de trouver de nombreux exemples comme celui-ci How to Use GridLayout ... dry.gif
Go to the top of the page
 
+Quote Post
molgow
posté 1 Feb 2004, 10:05
Message #7


Adepte de Macbidouille
*

Groupe : Membres
Messages : 178
Inscrit : 14 Jun 2003
Lieu : Suisse
Membre no 8 064



Tu fais quoi à droite du "zeLayout =" ... ??! rolleyes.gif

Tu créée une nouvelle instance de la classe GridLayout!! Donc zeLayout doit être déclaré du type GridLayout (ou alors d'une superclasse de GridLayout, vu que le type statique (à la déclaration) n'est pas forcément égal au type dynamique (à l'exécution)).
pour être formel: ClasseA var = new ClasseB(); => ClasseB <: ClasseA wink.gif

Pour l'erreur que tu as eu au tout début. N'oublies pas une chose: toutes les méthodes déclarées "static" sont des méthodes qui sont adressées à la classe elle-même (donc au "moule à objet"). Ensuite, les méthodes qui ne sont pas déclarées "static" sont des méthodes d'instances. Qui doivent donc être appelée sur un objet, sur une instance de ta classe. Tu ne peux donc pas appeler une méthode d'instance sur ta classe, et de la même manière tu ne peux pas appeler une méthode de classe sur une instance!

Donc pour ton problème du début, tu nous a montré un bout de code qui ne veut rien dire (montre nous un peu plus, laisse au moins les déclarations de méthodes (car là c'est incompréhensible)! Mais à mon avis, tu devrais probablement transformer ta méthode static (où se situait le problème) en une méthode d'instance.
Go to the top of the page
 
+Quote Post
arnaudp
posté 1 Feb 2004, 10:20
Message #8


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 814
Inscrit : 11 Oct 2002
Lieu : Nantes
Membre no 4 083



QUOTE (mpergand @ 1 Feb 2004, 09:04)
Une petite recherche avec Google devrait te permettre de trouver de nombreux exemples comme celui-ci How to Use GridLayout ... dry.gif

Merci pour le tuyau !! Je ne pensais pas à l'utilisation de google...!


--------------------

Fan d'apple depuis ... 1987. Donc pas parmi les premiers, mais ça fait tout de même un moment.

la vraie nouveauté, c'est ce qui ne vieillit pas malgré le temps. (Muriel Barbery)
Membre n° 87 du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
Go to the top of the page
 
+Quote Post
arnaudp
posté 1 Feb 2004, 10:42
Message #9


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 814
Inscrit : 11 Oct 2002
Lieu : Nantes
Membre no 4 083



QUOTE (molgow @ 1 Feb 2004, 09:05)
Tu créée une nouvelle instance de la classe GridLayout!! Donc zeLayout doit être déclaré du type GridLayout (ou alors d'une superclasse de GridLayout, vu que le type statique (à la déclaration) n'est pas forcément égal au type dynamique (à l'exécution)).
pour être formel: ClasseA var = new ClasseB();  =>  ClasseB <: ClasseA    wink.gif

Pour l'erreur que tu as eu au tout début. N'oublies pas une chose: toutes les méthodes déclarées "static" sont des méthodes qui sont adressées à la classe elle-même (donc au "moule à objet"). Ensuite, les méthodes qui ne sont pas déclarées "static" sont des méthodes d'instances. Qui doivent donc être appelée sur un objet, sur une instance de ta classe. Tu ne peux donc pas appeler une méthode d'instance sur ta classe, et de la même manière tu ne peux pas appeler une méthode de classe sur une instance!

Donc pour ton problème du début, tu nous a montré un bout de code qui ne veut rien dire (montre nous un peu plus, laisse au moins les déclarations de méthodes (car là c'est incompréhensible)! Mais à mon avis, tu devrais probablement transformer ta méthode static (où se situait le problème) en une méthode d'instance.

Merci milles fois pour toutes explications!!! et le temps que tu y a passé !

Je crios comprendre ce que tu écris (pour être bien sûr, il faut que je procède à des tests).

Cependant, une petite question :

Est ce que l'on peut dire qu'une méthode statique est inclue dans l'objet ?
Donc, qu'une méthode d'instance ( donc non statique, si j'ai compris) s'applique sur le moule à objet ?

La vraie difficulté de ce language c'est bien de différencier les concepts, je trouve : classe, instances, objet, super classes...

Pour mon code, j'en suis pas très fier mais bon. Voici toute ma classe myFrame appelé par main (Ha oui... j'ai pas encore effectué les modifs pour qu'il fonctionne comme indiqué ci dessus):


QUOTE
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;

public class MyFrame extends Frame implements ActionListener {

    TextField DegField = new TextField("0.00", 6),
    EchField = new TextField("", 3),
    Res1Field = new TextField("0.00", 15),
    Ech1Field = new TextField("  ", 3),
    Ech2Field = new TextField("  ", 3),
    Res2Field = new TextField("0.00", 15),
    MessageTexte = new TextField("", 20),
    Blanc = new TextField(" ",1),
    Blanc1 = new TextField(" ",1),
    Blanc2 = new TextField(" ",1);
    double Deg, Res1, Res2;
    String Ech, Ech1, Ech2;
    int nbCol;
    Temperature Temp;

    public MyFrame()
    {
Temp = new Temperature();
setTitle("Convertisseur Température");

Label DegLabel = new Label("Nombre"),
            EchLabel = new Label("Echelle"),
            Res1Label = new Label("Conversion 1"),
    Res2Label = new Label("Conversion 2"),
    Blanc = new Label(" "),
Blanc1 = new Label(" "),
Blanc2 = new Label(" ");


Panel DegLabelPanel = new Panel(new FlowLayout(FlowLayout.LEFT)),
            EchLabelPanel = new Panel(new FlowLayout(FlowLayout.LEFT)),
            Res1LabelPanel = new Panel(new FlowLayout(FlowLayout.LEFT)),
            Res2LabelPanel = new Panel(new FlowLayout(FlowLayout.LEFT));

Panel DegFieldPanel = new Panel(new FlowLayout(FlowLayout.LEFT)),
            EchFieldPanel = new Panel(new FlowLayout(FlowLayout.LEFT)),
            Res1FieldPanel = new Panel(new FlowLayout(FlowLayout.LEFT)),
            Res2FieldPanel = new Panel(new FlowLayout(FlowLayout.LEFT));

Panel BlancLabelPanel = new Panel(new FlowLayout(FlowLayout.RIGHT)),
    Blanc1LabelPanel = new Panel(new FlowLayout(FlowLayout.RIGHT)),
    Blanc2LabelPanel = new Panel(new FlowLayout(FlowLayout.RIGHT)),
            Ech1FieldPanel = new Panel(new FlowLayout(FlowLayout.LEFT)),
            Ech2FieldPanel = new Panel(new FlowLayout(FlowLayout.LEFT));

Panel MessageTexteLabelPanel = new Panel(new FlowLayout(FlowLayout.LEFT));

Button Bouton =  new Button("Calcul");

DegLabelPanel.add(DegLabel);
DegFieldPanel.add(DegField);
EchLabelPanel.add(EchLabel);
EchFieldPanel.add(EchField);
Res1LabelPanel.add(Res1Label);
Res1FieldPanel.add(Res1Field);
Ech1FieldPanel.add(Ech1Field);
Res2LabelPanel.add(Res2Label);
Res2FieldPanel.add(Res2Field);
Ech2FieldPanel.add(Ech2Field);
BlancLabelPanel.add(Blanc);
Blanc1LabelPanel.add(Blanc1);
Blanc2LabelPanel.add(Blanc2);
MessageTexteLabelPanel.add(MessageTexte);
add(DegLabelPanel);
add(DegFieldPanel);
add(BlancLabelPanel);
add(EchLabelPanel);
add(EchFieldPanel);
add(Blanc1LabelPanel);
add(Res1LabelPanel);
add(Res1FieldPanel);
add(Ech1FieldPanel);
add(Res2LabelPanel);
add(Res2FieldPanel);
add(Ech2FieldPanel);
add(Blanc2LabelPanel);
add(Bouton);
add(MessageTexteLabelPanel);
Bouton.addActionListener(this);
Res1Field.setEditable(false);
Res2Field.setEditable(false);
Ech1Field.setEditable(false);
Ech2Field.setEditable(false);
MessageTexte.setEditable(false);



/*DegField.addTextListener(this);
EchField.addTextListener(this);
addWindowListener(new MyAdapter(this));
*/

// 8 : nombre de lignes, 3, nombre de colonnes, 4, H gap et Vgap
/* En fait, le fait de mettre à 0 le nb de lignes permet de fixer le nb de colonnes. Le fait de mettre 8 n'est pas correcte en fait il faut mieux laisser le code faire.*/

setLayout(new GridLayout(0, 3));

c'est ici que j'ai positionné mes bidouilles :
//nbCol=GridLayout.getColumns();
en fonction de vos remarques, je f'rai bien ce bout de code :
GridLayout zeLayout = new GridLayout(0, 3);
setLayout(ZeLayout);
nbCol= ZeLayout.getColumns();




pack();
show();

    }

  DecimalFormat TempConv = new DecimalFormat("####0.00");

    //    public void textValueChanged (TextEvent e) : gestion du texte
    public void actionPerformed (ActionEvent e)
    {
/* Object source=e.getSource();
if (source == DegField ||
    source == EchField)
Permet de tester les champs plutôt que les boutons. */
/* test pour savoir pourquoi ma pûtain de grille ne marche pas. */

MessageTexte.setText(Integer.toString(nbCol));

if ( DegField.getText() != "0.00" &&
      EchField.getText() != "" )
{
            Deg = Double.parseDouble(DegField.getText());
            Ech = EchField.getText();
    // Formule : 1°C=(10°F-320)/18 - 1°F= 1,8°C+32
    //          1°C=(1°K + 273.15) <-> 1°K= 1°C - 273.15
    //          1°K= 10°F/18 - 290,94 <-> 1°F= 1,8°K + 523,67
    if ( Ech.equals("C") || Ech.equals("c"))
    {
  Ech1Field.setText("F");
  Ech2Field.setText("K");
  //double Temp=((10 * Deg)-320)/18 ;
  Temp.setNumber(((10 * Deg)-320)/18) ;
  Res1Field.setText(TempConv.format(Temp.getNumber()));
  Temp.setNumber(0.0);
  Temp.setNumber(Deg + 273.15);
  Res2Field.setText(TempConv.format(Temp.getNumber()));
  MessageTexte.setText("Et voilà le travail ©!");
    } else {
  if ( Ech.equals("F") || Ech.equals("f") )
  {
      Ech1Field.setText("C");
      Ech2Field.setText("K");
      //double Temp= (1.8 * Deg)+32;
      Temp.setNumber((1.8 * Deg)+32);
      Res1Field.setText(TempConv.format(Temp.getNumber()));
      Temp.setNumber(0.0);
      Temp.setNumber((1.8*Deg) + 523.67);
      Res2Field.setText(TempConv.format(Temp.getNumber()));
      MessageTexte.setText("Et voilà le travail(F)!");
  } else {
      if ( Ech.equals("K") || Ech.equals("k")) {
  Ech1Field.setText("C");
  Ech2Field.setText("F");
  //double Temp = Deg - 273.15;
  Temp.setNumber(Deg - 273.15);
  Res1Field.setText(TempConv.format(Temp.getNumber()));
  Temp.setNumber(0.0);
  Temp.setNumber((10*Deg)/18 - 290.94);
  Res2Field.setText(TempConv.format(Temp.getNumber()));
  MessageTexte.setText("Et voilà le travail (K)!");
      }
  }
    }

}
    }
//    catch (NumberFormatException ex) {}

}

class MyAdapter extends WindowAdapter {

    Frame myFrame;
    MyAdapter(Frame f) {
super();
myFrame = f;
    }

    public void windowClosing(WindowEvent e)
    {
myFrame.dispose();
    }
}



Voilà ... C'est du code inspiré du code de maitre et de bouquin.. mias bon. On apprend que par mimétisme!! huh.gif

Merci encore.


--------------------

Fan d'apple depuis ... 1987. Donc pas parmi les premiers, mais ça fait tout de même un moment.

la vraie nouveauté, c'est ce qui ne vieillit pas malgré le temps. (Muriel Barbery)
Membre n° 87 du club des AIPBP (Anciens Inscrits Pas Beaucoup de Posts) Voir la liste
Go to the top of the page
 
+Quote Post
mpergand
posté 1 Feb 2004, 11:10
Message #10


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 198
Inscrit : 8 Oct 2003
Membre no 10 220



Les notions d'objet, classe, instance, subclass, superclass, etc, ne sont pas spécifique à java mais commun à tous les languages objet. Je te conseillerais, avant toute chose, de bien assimiler ces concepts, car sinon tu risques de rencontrer de nombreuses difficultés.
Encore une fois Google te permettra de trouver de nombreux tutos (et en français).
ex: Developpez.com
Go to the top of the page
 
+Quote Post
molgow
posté 1 Feb 2004, 12:59
Message #11


Adepte de Macbidouille
*

Groupe : Membres
Messages : 178
Inscrit : 14 Jun 2003
Lieu : Suisse
Membre no 8 064



QUOTE
setLayout(new GridLayout(0, 3));

c'est ici que j'ai positionné mes bidouilles :
//nbCol=GridLayout.getColumns();
en fonction de vos remarques, je f'rai bien ce bout de code :
GridLayout zeLayout = new GridLayout(0, 3);
setLayout(ZeLayout);
nbCol= ZeLayout.getColumns();


Tu crées deux fois un GridLayout ici, et tu fais deux fois un setLayout. Je crois pas que c'est ce que tu veux. N'oublies pas que chaque "new" crée un nouvel objet qui est différent. Par conséquent :

GridLayout var1 = new GridLayout(0, 3);
GridLayout var2 = new GridLayout(0, 3);


implique que var1 != var2 (et c'est TOUJOURS le cas).

Donc si tu veux tester le nombre de colonne de ton layout, je ferais qqch du style :

GridLayout layout = new GridLayout(0, 3);
this.setLayout(layout); // je rajoute le "this" car pour débuter je trouve que c'est plus clair
int nbCol = layout.getColumns();
// ensuite tu peux faire ce que tu veux avec nbCol, par exemple l'afficher sur le Terminal :
// System.out.println("nbCol = " + nbCol);


QUOTE
Est ce que l'on peut dire qu'une méthode statique est inclue dans l'objet ?
Donc, qu'une méthode d'instance ( donc non statique, si j'ai compris) s'applique sur le moule à objet ?
La vraie difficulté de ce language c'est bien de différencier les concepts, je trouve : classe, instances, objet, super classes...


Les difficultés que tu rencontres ne viennent pas de Java mais bien des concepts de l'orienté objet, comme l'a fait remarqué mpergand. Tu as intérêt à chercher de la documentation claire et complète sur la POO si tu veux être à l'aise plus rapidement avec la POO.

En fait, la difficulté avec Java, c'est qu'il mélange les méthodes de classes (static) et les méthodes d'instances (sans le static). Et c'est très déroutant pour les débutants.
Pour bien comprendre, il faut vraiment voir la classe elle-même comme un objet. Un objet qui ne peut répondre qu'à des méthodes static.
Go to the top of the page
 
+Quote Post
Bac's
posté 1 Feb 2004, 17:09
Message #12


Tendance cubiste
*****

Groupe : Membres
Messages : 1 595
Inscrit : 17 Sep 2003
Lieu : Là où ce qui tombe des arbres à l'automne commence par 'F' et finit par 'n'
Membre no 9 643



QUOTE (arnaudp @ 1 Feb 2004, 10:42)
Cependant, une petite question :

Est ce que l'on peut dire qu'une méthode statique est inclue dans l'objet ?
Donc, qu'une méthode d'instance ( donc non statique, si j'ai compris) s'applique sur le moule à objet ?

C'est le contraire : une méthode d'instance s'applique à ... une instance, c-à-d à un objet de la classe donnée alors qu'une méthode statique s'applique à la classe en elle-même (on n'a pas besoin d'objet de la classe pour l'utiliser, c'est pour cela qu'en Java on utilisera nomClasse.méthode alors qu'en C++ on ferait nomClasse::methode pour appeler une méthode statique (ou méthode de classe selon certains auteurs)).


--------------------
G5 1,6GHz 1 270Mo RAM OS/X 10.4.1 + STHome Hyper-Bidouillé

C'est à force de rater que l'on finit par réussir. Devise Shadok.


[Editus moderatus]Plus de bannières merci... [Editus Bacsus]Oui chef, bien chef !
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 4th April 2026 - 15:43