Endroit d'ouverture de JOptionPane, JDialog [Résolu]

profiter 211 Messages postés mercredi 15 juin 2011Date d'inscription 15 mars 2013 Dernière intervention - 4 sept. 2011 à 12:23 - Dernière réponse : cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention
- 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
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Utilisateur anonyme - 4 sept. 2011 à 15:43
3
Merci
(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

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 4 sept. 2011 à 14:00
0
Merci
Bonjour,

Lorsque tu appelles la JOptionPane, le premier argument qui est surement à null chez toi représente le composant sur lequel centrer la JInternalFrame.
Commenter la réponse de cs_Julien39
profiter 211 Messages postés mercredi 15 juin 2011Date d'inscription 15 mars 2013 Dernière intervention - 4 sept. 2011 à 14:59
0
Merci
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
Commenter la réponse de profiter
Utilisateur anonyme - 4 sept. 2011 à 15:45
0
Merci
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
Commenter la réponse de Utilisateur anonyme
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 4 sept. 2011 à 22:11
0
Merci
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
Commenter la réponse de cs_Julien39
profiter 211 Messages postés mercredi 15 juin 2011Date d'inscription 15 mars 2013 Dernière intervention - 5 sept. 2011 à 17:28
0
Merci
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
Commenter la réponse de profiter
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 5 sept. 2011 à 18:36
0
Merci
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)
Commenter la réponse de cs_GodConan

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.