OVH Cloud OVH Cloud

[debutant] fermer une JFrame

13 réponses
Avatar
areuh
Bonsoir a tous et toutes.

Ce soir j' ai une petite question a propos de comment pouvoir fermer une
JFrame par un JButton.

Je cree une classe qui herite de JFrame (si je ne me trompe pas cela me
cree une JFrame)

je cree un layoutmanager, des JPanel, des JButton.

Qd je clique sur un JButton de cette JFrame, je souhaite fermer cette
JFrame, donc j' ecris :

btnF01Agenererbis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis) {
if ( (JButton) clickbtnF01Agenererbis.getSource() ==
btnF01Agenererbis)
// si j' ecris : "this.hide();" cela ne fonctionne pas
// "this.dispose();" ne fonctionne pas non plus
}
}
);

Qqu' un peut il m' expliquer pourquoi ces methodes ne peuvent etre
appliquees a this.

Voilà,
un grand merci
a+
areuh

10 réponses

1 2
Avatar
Cem
Le 21-02-2004, areuh a écrit :
Je cree une classe qui herite de JFrame (si je ne me trompe pas cela me
cree une JFrame)

je cree un layoutmanager, des JPanel, des JButton.

Qd je clique sur un JButton de cette JFrame, je souhaite fermer cette
JFrame, donc j' ecris :

btnF01Agenererbis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis) {
if ( (JButton) clickbtnF01Agenererbis.getSource() = > btnF01Agenererbis)
// si j' ecris : "this.hide();" cela ne fonctionne pas
// "this.dispose();" ne fonctionne pas non plus
}
}
);

Qqu' un peut il m' expliquer pourquoi ces methodes ne peuvent etre
appliquees a this.
Bon je débute en java, alors je n'ai pas vraiment la réponse.

Mais en faisant un test moi même, j'ai constaté en mettant
System.out.println(this.getClass().getName()) dans le code ci-dessus que
this est un objet de classe interne anonyme.
En théorie il devrait avoir accès aux méthodes de la classe qui la
contient.
J'ai constaté qu'en mettant hide() ou dispose() (sans this devant),
ça marche. Dans ce cas, pourquoi le compilateur refuse this.hide() ?
Mystère.
De toute façon, ne serait-il pas préférable de mettre l'instruction
System.exit(0) ?

Avatar
Arman Ozcelik
Bonjour,

Essaie plutôt

if (clickbtnF01Agenererbis.getSource() .equals(btnF01Agenererbis) ){
....
}

On ne peut comparer deux objets avec == en java. Cette comparaison n'est
possible qu'avec les types primitifs.


"areuh" wrote in message
news:
Bonsoir a tous et toutes.

Ce soir j' ai une petite question a propos de comment pouvoir fermer une
JFrame par un JButton.

Je cree une classe qui herite de JFrame (si je ne me trompe pas cela me
cree une JFrame)

je cree un layoutmanager, des JPanel, des JButton.

Qd je clique sur un JButton de cette JFrame, je souhaite fermer cette
JFrame, donc j' ecris :

btnF01Agenererbis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis) {
if ( (JButton) clickbtnF01Agenererbis.getSource() = > btnF01Agenererbis)
// si j' ecris : "this.hide();" cela ne fonctionne pas
// "this.dispose();" ne fonctionne pas non plus
}
}
);

Qqu' un peut il m' expliquer pourquoi ces methodes ne peuvent etre
appliquees a this.

Voilà,
un grand merci
a+
areuh




Avatar
Cem
Le 22-02-2004, Arman Ozcelik a écrit :
btnF01Agenererbis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis) {
if ( (JButton) clickbtnF01Agenererbis.getSource() = >> btnF01Agenererbis)
...
Essaie plutôt


if (clickbtnF01Agenererbis.getSource() .equals(btnF01Agenererbis) ){
....
}

On ne peut comparer deux objets avec == en java. Cette comparaison n'est
possible qu'avec les types primitifs.

Pourtant, test fait, ça marche bien aussi avec ==.

Quelle est la différence entre x == y et x.equals(y) ?


Avatar
Willy
if (clickbtnF01Agenererbis.getSource() .equals(btnF01Agenererbis) ){
....
}

On ne peut comparer deux objets avec == en java. Cette comparaison
n'est possible qu'avec les types primitifs.


manque de bol, ici, c'est parfaitement possible.
La source est bien l'objet btnF01Ablablabla, donc une comparaison des
pointeurs est parfaitement reconnue.

Ensuite :
btnF01Agenererbis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis)
{ if ( (JButton) clickbtnF01Agenererbis.getSource() = > btnF01Agenererbis)
// si j' ecris : "this.hide();" cela ne fonctionne pas
// "this.dispose();" ne fonctionne pas non plus
}
}
);


this.dispose() correspond à la classe anonyme héritée de l'ActionListener().
Et ActionListener (une interface), ne contient pas de méthode dispose().
Par contre, un simple
dispose();
appelle la méthode de fermeture de fenêtre de la classe "en cours".
Notes bien que tu ne pourrais pas le faire en créant une "vrai" classe et
pas une classe anonyme.

ex :
class MaFrame extends JFrame {
class MonListener implements ActionListener {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis) {
if ( (JButton) clickbtnF01Agenererbis.getSource() = btnF01Agenererbis)
dispose();
}
}
}
est légal et répond parfaitement à ta demande, tandis que deux classes
séparées (MonListener dans un autre fichier) serait complètement impossible.

Celà dit, dans le ActionEvent, il est parfaitement possible de récupérer la
classe JFrame qui appelle le listener, et tu pourrais alors faire ton
dispose() sur cet objet.

bon courage
Willy

Avatar
areuh
Cem écrivait
news::

Le 21-02-2004, areuh a écrit :
Je cree une classe qui herite de JFrame (si je ne me trompe pas cela me
cree une JFrame)

je cree un layoutmanager, des JPanel, des JButton.

Qd je clique sur un JButton de cette JFrame, je souhaite fermer cette
JFrame, donc j' ecris :

btnF01Agenererbis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis) {
if ( (JButton) clickbtnF01Agenererbis.getSource() = >> btnF01Agenererbis)
// si j' ecris : "this.hide();" cela ne fonctionne pas
// "this.dispose();" ne fonctionne pas non plus
}
}
);

Qqu' un peut il m' expliquer pourquoi ces methodes ne peuvent etre
appliquees a this.
Bon je débute en java, alors je n'ai pas vraiment la réponse.

Mais en faisant un test moi même, j'ai constaté en mettant
System.out.println(this.getClass().getName()) dans le code ci-dessus que
this est un objet de classe interne anonyme.
En théorie il devrait avoir accès aux méthodes de la classe qui la
contient.
J'ai constaté qu'en mettant hide() ou dispose() (sans this devant),
ça marche. Dans ce cas, pourquoi le compilateur refuse this.hide() ?
Mystère.
De toute façon, ne serait-il pas préférable de mettre l'instruction
System.exit(0) ?

Ben System.exit(0) ça sert a quitter une application, moi je ne veux que

fermer une fenetre en cliquant sur un bouton contenu ds cette meme fenetre.

Je viens d' essayer
btnF01Agenererbis.aaddActionListener(this);
public void actionPerformed(ActionEvent evt){
if( evt.getActionCommand().equals("Générer"){
this.hide();
}}

celle- ci fonctionne,
néanmoins :
les JTextFields de la fenetre, qui devaient etre remplis à son ouverture ne
le sont plus, ça n' est pas très important.

Le plus important c' est que j' ai 2 syntaxes differenes pour mes JButton,
ça aussi c' est un détail, mais j' aimerai bien comprendre pourquoi la
syntaxe initiale empêche l' utilisation de "this.hide();"

Enfin je verrai ça un peu plus tard.

Merci pour le coup de main
a+
areuh


Avatar
areuh
"Willy" écrivait
news:c19opj$7t5$:

if (clickbtnF01Agenererbis.getSource() .equals(btnF01Agenererbis) ){
....
}

On ne peut comparer deux objets avec == en java. Cette comparaison
n'est possible qu'avec les types primitifs.


manque de bol, ici, c'est parfaitement possible.
La source est bien l'objet btnF01Ablablabla, donc une comparaison des
pointeurs est parfaitement reconnue.

Ensuite :
btnF01Agenererbis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis)
{ if ( (JButton) clickbtnF01Agenererbis.getSource() = >> btnF01Agenererbis)
// si j' ecris : "this.hide();" cela ne fonctionne pas
// "this.dispose();" ne fonctionne pas non plus
}
}
);


this.dispose() correspond à la classe anonyme héritée de
l'ActionListener(). Et ActionListener (une interface), ne contient pas
de méthode dispose(). Par contre, un simple
dispose();
appelle la méthode de fermeture de fenêtre de la classe "en cours".
Notes bien que tu ne pourrais pas le faire en créant une "vrai" classe
et pas une classe anonyme.

ex :
class MaFrame extends JFrame {
class MonListener implements ActionListener {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis)
{
if ( (JButton) clickbtnF01Agenererbis.getSource() = > btnF01Agenererbis)
dispose();
}
}
}
est légal et répond parfaitement à ta demande, tandis que deux classes
séparées (MonListener dans un autre fichier) serait complètement
impossible.

Celà dit, dans le ActionEvent, il est parfaitement possible de
récupérer la classe JFrame qui appelle le listener, et tu pourrais
alors faire ton dispose() sur cet objet.

bon courage
Willy


Pour armand :
Je viens d' essayer

btnF01Agenererbis.aaddActionListener(this);
public void actionPerformed(ActionEvent evt){
if( evt.getActionCommand().equals("Générer"){
this.hide();
}}

celle- ci fonctionne,
néanmoins :
les JTextFields de la fenetre, qui devaient etre remplis à son ouverture ne
le sont plus, ça n' est pas très important.

Le plus important c' est que j' ai 2 syntaxes differenes pour mes JButton,
ça aussi c' est un détail, mais j' aimerai bien comprendre pourquoi la
syntaxe initiale empêche l' utilisation de "this.hide();"

Enfin je verrai ça un peu plus tard.

Merci pour le coup de main
a+
areuh



pour Willy
je viens d' essayer ce que tu preconises, je recapitule :

ds ma classe ClasseFenetre je cree une classe de paquet (équivalent de
classe anonyme ???) MonListener ds lequel j' essaye d' implementer le
"dispose();"
J' écris le code sous JBuilder qui appelle des audits de code (tu ecris un
objet et JBuilder te propose toutes les methodes applicables à cet objet
ds le contexte présent).
Qd j' implemente cette classe de paquet, j' essaye d implementer dispose()
(ou + exactement "this.dispose();") et l' audit de code ne me propose ni
hide() ni dispose(), donc a priori ta technique ne resoud pas mon probleme,
a moins que ce soit moi qui ne pratiqua pas correctement.

Voilà, comme mon probleme est resolu, je vais laisser comme ça, mais bon si
vous avez des idées, je suis rpeneur, je les essaierai.

Merci a tous
a+
areuh


Avatar
Cem
Le 22-02-2004, areuh a écrit :
Le plus important c' est que j' ai 2 syntaxes differenes pour mes JButton,
ça aussi c' est un détail, mais j' aimerai bien comprendre pourquoi la
syntaxe initiale empêche l' utilisation de "this.hide();"
Et bien parce que dans ce cas this se rapporte à un objet de classe

interne (et non la sous-classe de JFrame).
Mais vous pourriez garder votre syntaxe initiale en mettant simplement
hide() (sans préfixer par this.) et là ça devrait marcher.

Avatar
Xav
btnF01Agenererbis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis) {
if ( (JButton) clickbtnF01Agenererbis.getSource() = > btnF01Agenererbis)
// si j' ecris : "this.hide();" cela ne fonctionne pas
// "this.dispose();" ne fonctionne pas non plus
}
}


Dans le cas d'une inner class l'object this est l'innerclass elle même.
Dans ton cas une ActionListener, c'est pourquoi this.hide() ne compile pas
...

Par contre si tu écris "hide ()" tout court ou "JFrame.this.hide ()" ca
fonctionnera

Xav.

ps:
Une inner à plusieurs "this"...

"areuh" wrote in message
news:
Bonsoir a tous et toutes.

Ce soir j' ai une petite question a propos de comment pouvoir fermer une
JFrame par un JButton.

Je cree une classe qui herite de JFrame (si je ne me trompe pas cela me
cree une JFrame)

je cree un layoutmanager, des JPanel, des JButton.

Qd je clique sur un JButton de cette JFrame, je souhaite fermer cette
JFrame, donc j' ecris :

btnF01Agenererbis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis) {
if ( (JButton) clickbtnF01Agenererbis.getSource() = > btnF01Agenererbis)
// si j' ecris : "this.hide();" cela ne fonctionne pas
// "this.dispose();" ne fonctionne pas non plus
}
}
);

Qqu' un peut il m' expliquer pourquoi ces methodes ne peuvent etre
appliquees a this.

Voilà,
un grand merci
a+
areuh




Avatar
Mielmonster
salut,

x==y teste l'egalité des références (pointeurs) des objets.
x.equals(y) teste l'égalité de valeurs.

par ex,

String x = "hello";
String y = "hello";

x == y renvoit faux
x.equals(y) renvoit vrai

par contre, si tu fais
x = y;

x ==y renvoit vrai
x.equals(y) renvoit vrai

en esperant avoir pu t'aider

a+

Yannick

"Cem" a écrit dans le message de
news:
btnF01Agenererbis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent clickbtnF01Agenererbis) {
if ( (JButton) clickbtnF01Agenererbis.getSource() = > >> btnF01Agenererbis)
...
Essaie plutôt


if (clickbtnF01Agenererbis.getSource() .equals(btnF01Agenererbis) ){
....
}

On ne peut comparer deux objets avec == en java. Cette comparaison n'est
possible qu'avec les types primitifs.

Pourtant, test fait, ça marche bien aussi avec ==.

Quelle est la différence entre x == y et x.equals(y) ?




Avatar
Cem
Le 23-02-2004, Mielmonster a écrit :
x==y teste l'egalité des références (pointeurs) des objets.
x.equals(y) teste l'égalité de valeurs.

OK. Merci.

Je m'en doutais un peu pour String mais c'est un peu particulier.
Si on prend 2 JButton x et y.
x==y compare les références, donc si x==y signifie que c'est le même
bouton.
En revanche, je m'interroge un peu sur x.equals(y). Est ce que 2 boutons
peuvent donner x.equals(y) vrai et x==y faux ?
Apparemment, la classe JButton hérite sa méthode equals de Object
(contrairement à String qui la redéfinit).
Je n'ai pas l'impression qu'il y a ait la moindre différence entre x==y
et x.equals(y) pour ce type d'objet.

1 2