Endroit d'ouverture de JOptionPane, JDialog

Résolu
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 - 4 sept. 2011 à 12:23
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 - 5 sept. 2011 à 18:36
bonjour,
j'utilise dans mon application un JIntenalframe contenu dans un JDesctopPane
j'ai des bouttons dans ce internalfram
quelque une lance un JOptionpane ou un JDialog lors du clique :
=> je veux que lorsque le JOptionPane ou le JDialog s'ouvre : c'est au milieu de mon internaleframe , pas au milieu de l'ecran du pc

merci d'avance

7 réponses

Utilisateur anonyme
4 sept. 2011 à 15:43
(sachant que this ca veut dire mon internaleframe)

Dans ton cas justement non...Je t'explique.

Déjà, je simplifie volontairement ton code pour que ce soit plus simple.
JButton btnNewButton = new JButton("supprimer");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
// ton code
}
});


En temps normal, quand tu utilises le mot-clé this, tu fais appel à l'instance de la classe que tu utilises.
Donc, si tu faisais une méthode dans une classe X, this désignerait l'objet de la classe X qui est entrain d'être utilisé.

Sauf que dans ton cas, tu fais appel à une classe anonyme interne. Dans ton ta méthode addActionListener, tu crées un nouvel objet ActionListener. Tu en profites pour définir dans ta lancée la méthode actionPerformed de ton objet ActionListener. Donc, si dans cette méthode tu fais appel à this, tu fais référence en fait à l'objet utilisé donc ton actionListener. Voilà pourquoi j'utilise très rarement cette façon de faire.

Ce que tu peux tenter, c'est d'avoir une variable contenant ta JInternalFrame et de faire passer cette variable.

Sinon, une méthode un peu plus propre, tu fais implémenter l'interface ActionListener à ta classe.
Et dans la méthode actionPerformed implémentée, tu pourra mettre ton code en utilisant this sans soucis. Il te suffira alors de faire

btnNewButton.addActionListener(this); 


Dans les deux cas, this sera l'objet de ta classe qui est entrain d'être utilisé, j'imagine ta JInternalFrame.

Ce n'est pas forcément clair, donc si tu as des questions poses-les.

--
Pylouq
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 sept. 2011 à 14:00
Bonjour,

Lorsque tu appelles la JOptionPane, le premier argument qui est surement à null chez toi représente le composant sur lequel centrer la JInternalFrame.
0
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
4 sept. 2011 à 14:59
j'ai essayé mais
lorsque je met this dans le premier argument (sachant que this ca veut dire mon internaleframe) il me met une erreur
il est souligné par une ligne rouge

je pense c'est parsque le JOptionpane est dans actionListener
voila le code :
JButton btnNewButton = new JButton("supprimer");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
 
if(table.getSelectedRowCount() == 0 ) {
JOptionPane.showMessageDialog(null, "aucun article n'est seléctionné!","Warning", JOptionPane.WARNING_MESSAGE);
return ;
}

JOptionPane jop = new JOptionPane();			
@SuppressWarnings("static-access")
int option = jop.showConfirmDialog(null, "vous etes sur de vouloir supprimer ce(s) article(s) ?", "suppression d'articles", 
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if(option == JOptionPane.OK_OPTION){
int[] selection = table.getSelectedRows();
for(int i = 0 ; i< table.getSelectedRowCount() ; i++){
        	 Object a = mm.getValueAt(table.getSelectedRow(), 0);

if(ca.IsEditable(a)){

ca.supprimer(table.getValueAt(selection[i],0));
mm.removeRow(selection[i]);
}else{

        		 JOptionPane.showMessageDialog(null, "Cet article ne peut pas etre supprimé car \n" +
        		 		"il est contenu dans des commandes\npour le supprimer il faut l'eliminer de tous\n" +
        		 		"les commandes qui le contient  ","ERROR", JOptionPane.ERROR_MESSAGE);
return ;
        	 
}
}
}

    	 
}
});

et l'erreur :
Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem: 
The method showConfirmDialog(Component, Object, String, int, int) in the type JOptionPane is not applicable for the arguments (new ActionListener(){}, String, String, int, int)

at com.kha.vue_article.articles_vue$3.actionPerformed(articles_vue.java:161)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)


quelle est la solution a votre avis
merci
0
Utilisateur anonyme
4 sept. 2011 à 15:45
J'oubliais, pense à faire un contrôle dans ta méthode actionPerformed si tu fais comme je t'ai dis plus haut.
Car cette méthode sera appelée par tous tes composants qui ont besoin d'un actionListener, et sans condition, tout le code de la fonction sera xecuté.

(une condition du genre :
if ( arg0.getSource().equals(btnNewButton) ){
          //et ton ton code
}

)


--
Pylouq
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 sept. 2011 à 22:11
Bonjour,

Je ne pense pas que cette facon de faire sois plus propre, ce n'est pas vraiment dans l'esprit de la conception objet de faire un switch sur la totalité des composants.

Cependant, la remarque de pylouq est juste et ta facon de faire n'est pas la bonne non plus :)

La meilleure facon de faire à mon avis est de créer ton actionListener dans une classe à part Tu as ta classe qui étend la JInternalFrame disons ClasseA, pour ajouter un actionListener sur un de ses boutons tu le créé dans une classe à part :

public class ListenerBouton1 implements ActionListener {
    private ClasseA classeA;

   public ListenerBouton1(ClasseA c){
      classeA=c;
   }


   public void actionPerformed(ActionEvent e){
      //Tes actions
      JOptionPane.showMessageDialog(classeA, "message");
   }
}


Et ensuite, dans la classe A tu fais

bouton1.addActionListener(new ListenerBouton1(this));


De cette manière, tu règles le problème du this sans avoir à faire de switch et en ayant une conception objet propre
0
profiter Messages postés 205 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 15 mars 2013 8
5 sept. 2011 à 17:28
moi j'utilise la methode vu dans mon code car c'est un code generé par eclipse lors de construction de mes vues
donc je veux pas perdre plus de temps
j'ai adapté la solution proposé par Pylouq de

Ce que tu peux tenter, c'est d'avoir une variable contenant ta JInternalFrame et de faire passer cette variable.

ca marché,
merci pour vous tous
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
5 sept. 2011 à 18:36
normalement ton instance est accessible par TaClass.this ;o) à l interrieur des anonyme ;o) ...

ceci dit la plus propre de toutes les solution pour l utilisation des boutons et menu et de faire une class Action par action possible ;o) héritant de AbstractAction, cela represente un peu plus de codage ;o) mais simplifie énormement la suite... la sérialization ;o) possible des actions est un des avantgages.. ;o)


GodConan ;o)
0
Rejoignez-nous