Probleme avec Jpanel

Probleme avec Jpanel - Java - Programmation

Marsh Posté le 27-10-2003 à 14:30:32    

Alors, d'abord, ne m'incendiez pas trop vite, je débute carrément.  :D  
 
Je suis en train de faire un genre de topstyle dans jEdit.
 
Quand je clique sur une propriété dans le xinsert, je déclenche l'ouverture d'un Jpanel.
 
Au départ, ce Jpanel s'appuyait sur un field panel. Or, moi, il me faut un JComboBox pour lister les propriétés à rentrer.
 
Tout marche parfaitement sauf que :
 
1) Quand j'appuie sur Entrée ou OK, il ne se passe rien.
2) Quand je clique sur une propriété dans le JComboBoc, LA PREMIERE FOIS, je dois recliquer pour faire disparaitre la liste.
 
Pourriez-vous me donner un petit coup de main, sachant que c'est pour la bonne cause, et que je suis conscient qu'il faut que j'apprenne réellement le java pour pouvoir faire ce que je veux faire.  :)  
 

Code :
  1. // import statements
  2. import javax.swing.border.*;
  3. // main routine
  4. void azimutDialog()
  5. {
  6.     // create dialog object and set its features
  7.     title = "azimuth";
  8.     dialog = new JDialog(view, title, false);
  9.     content = new JPanel(new BorderLayout());
  10.     content.setBorder(new EmptyBorder(12, 12, 12, 12));
  11.     dialog.setContentPane(content);
  12.     // add to the dialog a panel containing the text fields for
  13.     // entry of the prefix
  14.     fieldPanel = new JPanel(new GridLayout(4, 1, 0, 6));
  15.     prefixField = new JComboBox();
  16.     prefixLabel = new JLabel("valeur :" );
  17.    
  18.     // valeurs
  19.    
  20.     String[] comboContenu = {"inherit","left-side","far-left","center-left","center-right","far-right","right-side","leftwards","rightwards","left","center","right","behind"};
  21.    
  22.    
  23.     prefixField.insertItemAt(comboContenu[0], 0);
  24.     prefixField.insertItemAt(comboContenu[1], 1);
  25.     prefixField.insertItemAt(comboContenu[2], 2);
  26.     prefixField.insertItemAt(comboContenu[3], 3);
  27.     prefixField.insertItemAt(comboContenu[4], 4);
  28.     prefixField.insertItemAt(comboContenu[5], 5);
  29.     prefixField.insertItemAt(comboContenu[6], 6);
  30.     prefixField.insertItemAt(comboContenu[7], 7);
  31.     prefixField.insertItemAt(comboContenu[8], 8);
  32.     prefixField.insertItemAt(comboContenu[9], 9);
  33.     prefixField.insertItemAt(comboContenu[10], 10);
  34.     prefixField.insertItemAt(comboContenu[11], 11);
  35.     prefixField.insertItemAt(comboContenu[12], 12);
  36.    
  37.     prefixField.setSelectedIndex(0);
  38.        
  39.    
  40.     fieldPanel.add(prefixLabel);
  41.     fieldPanel.add(prefixField);
  42.    
  43.     content.add(fieldPanel, "Center" );
  44.     // add a panel containing the buttons
  45.     buttonPanel = new JPanel();
  46.     buttonPanel.setLayout(new BoxLayout(buttonPanel,
  47.     BoxLayout.X_AXIS));
  48.     buttonPanel.setBorder(new EmptyBorder(12, 50, 0, 50));
  49.     buttonPanel.add(Box.createGlue());
  50.     ok = new JButton("OK" );
  51.     cancel = new JButton("Cancel" );
  52.    
  53.     dialog.getRootPane().setDefaultButton(ok);
  54.     buttonPanel.add(ok);
  55.    
  56.     buttonPanel.add(cancel);
  57.    
  58.     content.add(buttonPanel, "South" );
  59.     // register this method as an ActionListener for
  60.     // the buttons and text fields
  61.    
  62.     ok.addActionListener(this);
  63.     cancel.addActionListener(this);
  64.     prefixField.addActionListener(this);
  65.    
  66.     // locate the dialog in the center of the
  67.     // editing pane and make it visible
  68.     dialog.pack();
  69.     dialog.setLocationRelativeTo(view);
  70.     dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
  71.     dialog.setVisible(true);
  72.     // this method will be called when a button is clicked
  73.     // or when ENTER is pressed
  74.     void actionPerformed(e)
  75.     {
  76.         if(e.getSource() != cancel)
  77.         {
  78.             processText();
  79.         }
  80.         dialog.dispose();
  81.     }
  82.    
  83.     void processText()
  84.     {
  85.       prefix = prefixField.getText();
  86.       textArea.setSelectedText(prefix); 
  87.     }
  88.    
  89. }
  90. azimutDialog();


 
Voilà où j'en suis.
 
Je suis tout étonné d'avoir réussi à aller jusque là, puisqu'il n'y a aucun exemple d'utilisation du JComboBox dans Jedit au niveau des macros.  :pt1cable:


Message édité par Hermes le Messager le 27-10-2003 à 15:33:52
Reply

Marsh Posté le 27-10-2003 à 14:30:32   

Reply

Marsh Posté le 27-10-2003 à 15:21:52    

Bon alors déjà y a un constructeur pour les combobox qui prend un tableau d'objet, ça ira plus vite ;)
 
Et puis va voir les tuto ici:
 
java.sun.com
 
Il est défini où textArea ?


Message édité par LetoII le 27-10-2003 à 15:29:26

---------------
Le Tyran
Reply

Marsh Posté le 27-10-2003 à 15:27:58    

Oula oula, je suis loin d'avoir le niveau suffisant pour m'en sortir tout seul je pense. Dans quelques mois, je pense que oui, parce que j'ai fait pas mal de C et de PHP. Mais pour le moment, je bloque.
Je me suis mis au java hier soir seulement. :D  
 
Je reconnais que je ne devrais pas poser ma question maintenant, mais comme je bosse sur un projet qui va intéresser toute la communauté, je me le permet quand même.
 
J'ai déjà réussi à utiliser le sélecteur de couleur pour insérer un color: la_couleur; dans le textarea. Si j'arrive à maitriser ce problème de liste, je vais pouvoir recréer PARFAITEMENT Topstyle dans JEdit. :)

Reply

Marsh Posté le 27-10-2003 à 15:31:46    

Code :
  1. void processText()
  2.         {
  3.             textArea.setSelectedText(prefix); 
  4.         }


 
il est défini ou prefix ? tu le positionne ou ?

Reply

Marsh Posté le 27-10-2003 à 15:35:19    

je soupçonne que c'est du bean shell, jme trompe? :)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 15:36:11    

Désolé, je me suis trompé en copiant/collant. J'ai édité mon code. (c'est à la fin).
 
Mais, ça ne change rien au problème, parce que de toutes manières, même si je fais :
 

Code :
  1. textArea.setSelectedText("coucou" );

 
 
ça ne marche pas et SURTOUT le Jpanel ne se ferme pas. C'est incompréhensible parce que pour mon code précédent (le sélecteur de couleur) :
 

Code :
  1. selection = textArea.getSelectedText();
  2. if (selection != null)
  3.     color = GUIUtilities.parseColor(selection);
  4. else
  5.     color = null;
  6. color = JColorChooser.showDialog(view, "Color Picker", color);
  7. if (color != null)
  8.     textArea.setSelectedText("color : "+GUIUtilities.getColorHexString(color)+";" );


 
ça marche parfaitement.
 

Reply

Marsh Posté le 27-10-2003 à 15:39:29    

the real moins moins a écrit :

je soupçonne que c'est du bean shell, jme trompe? :)
 


Non, c'est bien du Bean shell, mais en fait, c'est presque du java avec des classes déjà implémentées. Mais dans le cas du combobox, c'est spécial, parce que justement, il ne semblait pas implémenté au départ.
Hors mon code marche parfaitement, je veux dire : je vois bien le combobox et je peux sélectionner une option dedant, mais pas moyen ensuite de valider mon choix. Le bouton OK réagit, mais rien ne se passe, et le Jpanel reste affiché.
Par contre le cancel marche parfaitement.
 
Merci de me donner un petit coup de main (d'autant qu'habituellement, je suis moi-même contre ce genre de situation où un gars arrive et n'a pas le niveau suffisant sur un problème donné et compte un peu sur les autres.) ;)

Reply

Marsh Posté le 27-10-2003 à 15:40:31    

ben pour le coup du bean shell c'etait juste que ça explique que c'est pas toi qui définit textArea et prefix par exemple ;)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 15:44:36    

Si, prefix, c'est moi. Je pourrait mettre une autre variable à la place. Le textArea non par contre, c'est celui de jEdit.
 
Mais de toutes manières, j'ai bcp de mal à comprendre pourquoi dans le 2° code (celui du sélecteur de couleur), tout marche parfaitement, et pas dans mon cas. Tout ce que je veux, c'est récupérer le résultat du combobox pour le mettre à l'emplacement du curseur dans le textare.
 
Dans le cas d'un simple input, j'y arrive déjà sans probleme par exemple.

Reply

Marsh Posté le 27-10-2003 à 15:46:48    

En fait, ce que je demande, c'est que qqu me donne un petit coup de main pour que je puisse faire cet arbre CSS + XHTML.
 
Cela permettra par exemple de faire apparaitre des Jpanel pour chaque propriété avec un choix dedant.
 
Le sélecteur de couleur : c'est rêglé.
Le sélecteur de fichier : aussi.
Le sélecteur input : également.
 
Il ne me reste plus que ce problème de combobox. :)

Reply

Marsh Posté le 27-10-2003 à 15:46:48   

Reply

Marsh Posté le 27-10-2003 à 15:47:14    

void actionPerformed(e)
        {
              if(e.getSource() != cancel)
              {
                    processText();
              }
              dialog.dispose();
        }


 
ta methode processText est bien appelée?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 15:48:40    

the real moins moins a écrit :

void actionPerformed(e)
        {
              if(e.getSource() != cancel)
              {
                    processText();
              }
              dialog.dispose();
        }


 
ta methode processText est bien appelée?


 
Justement, c'est la question que je me pose. Comment je pourrais le savoir ?  
Le cancel fonctionne parfaitement lui.

Reply

Marsh Posté le 27-10-2003 à 15:55:28    

Pour ceux qui ont installé jEdit, regardez ce que j'ai réussi à faire :
 
http://tousleschats.free.fr/hermes [...] insert.xml
 
Mettez ce fichier dans windows/.jedit
 
ou documents and settings/[pseudo]/.jedit  
 
:)
 

Reply

Marsh Posté le 27-10-2003 à 15:56:16    

ben le cancel fonctionne, c bcp dire, il fait rien ;)
la methode processText elle est definie ou!?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 15:56:34    

euh c bon j'ai vu :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 15:57:04    

ben rajoute un System.out.println("pouet" ) dedans :o
(tu le verras si t'as démarré jedit en console, ou bien dans des logs peut etre)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 15:57:18    

Ben là :
 

Code :
  1. void processText()
  2.         {
  3.             prefix = prefixField.getText();
  4.             textArea.setSelectedText(prefix); 
  5.         }


 
enfin je crois...

Reply

Marsh Posté le 27-10-2003 à 15:58:44    

euh , definition de prefixField , et dans prefix c quoi comme objet ?
et la methode setSelectedArea elle prend quoi comme argument..


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 16:00:43    

the real moins moins a écrit :

euh , definition de prefixField , et dans prefix c quoi comme objet ?
et la methode setSelectedArea elle prend quoi comme argument..


 
Oublies pour l'instant le problème de prefix. C'est surtout que textArea.setSelectedText("coucou" ); ne fonctionne pas non plus. Donc apparemment, il n'arrive pas à processText  :)  
 
C'est ce que j'aimerais comprendre en premier en fait.  :)  
 
Merci pour l'aide en tous cas.  :jap:


Message édité par Hermes le Messager le 27-10-2003 à 16:01:09
Reply

Marsh Posté le 27-10-2003 à 16:20:31    

ben le truc c'est que je suis pas convaincu que textArea.setSelectedText("coucou" ); doivent marcher...
 
c'est quoi comme object textArea??? (bordel)
qd tu sais ça, tu vas mater la javadoc de l'objet en question


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 16:24:06    

selection = textArea.getSelectedText();
textArea.setSelectedText("couc" );
 
Marche parfaitement. :D
 
Si je fais une macro juste avec ces deux lignes, j'ai bien couc dans le textarea de jEdit.

Reply

Marsh Posté le 27-10-2003 à 16:25:25    

Mieux, si je mets selection = textArea.getSelectedText();
au début du code que j'ai posté au début, ça affiche bien "couc"
 

Reply

Marsh Posté le 27-10-2003 à 16:37:03    

bon tu reponds à la question ou tu retournes faire du php hein [:mmmfff]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 16:53:59    

the real moins moins a écrit :

bon tu reponds à la question ou tu retournes faire du php hein [:mmmfff]


 
textArea - a JEditTextArea is the visible component that displays the file being edited. It is derived from the JComponent class. The variable textArea represents the current JEditTextArea object, which in turn displays the current buffer.
 
NONNNN, pas le PHP  :D

Reply

Marsh Posté le 27-10-2003 à 17:15:18    

Bon, oublions aussi ce problème.
 
Comment récupérer le résultat du click sur OK ou sur cancel en java ?
 
(PS pour le "prefix", c'est bon en fait : String prefix = (String)prefixField.getSelectedItem(); )
 

Reply

Marsh Posté le 27-10-2003 à 18:56:13    

comment ça le RESULTAT?
dans ton cas, qd un click est fait sur un truc ajouté avec comme ActionListener la classe en cours (this), la methode actionPerformed(e) est appelée. le if (e....) est vrai si ce n'est pas le bouton cancel (c'est donc le OK dans ton cas)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 18:56:59    

http://www.jedit.org/42docs/api/or [...] ng.String)
 
Replaces the selection at the caret with the specified text. If there is no selection at the caret, the text is inserted at the caret position.
 
vérifie la position du "caret" :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 19:08:35    

Bon, j'ai tout simplifié à l'extrême :
 
j'ai ça :
 

Code :
  1. import javax.swing.border.*;
  2. title = "azimuth";
  3. dialog = new JDialog(view, title, false);
  4. content = new JPanel(new BorderLayout());
  5. content.setBorder(new EmptyBorder(12, 12, 12, 12));
  6. dialog.setContentPane(content);
  7. fieldPanel = new JPanel(new GridLayout(4, 1, 0, 6));
  8. azimuthLabel = new JLabel("infos : " );
  9. fieldPanel.add(azimuthLabel);
  10. content.add(fieldPanel, "Center" );
  11. buttonPanel = new JPanel();
  12. buttonPanel.setLayout(new BoxLayout(buttonPanel,BoxLayout.X_AXIS));
  13. buttonPanel.setBorder(new EmptyBorder(12, 50, 0, 50));
  14. buttonPanel.add(Box.createGlue());
  15. ok = new JButton("OK" );
  16. cancel = new JButton("Cancel" );
  17. ok.setPreferredSize(cancel.getPreferredSize());
  18. dialog.getRootPane().setDefaultButton(ok);
  19. buttonPanel.add(ok);
  20. buttonPanel.add(Box.createGlue());
  21. buttonPanel.add(cancel);
  22. buttonPanel.add(Box.createGlue());
  23. content.add(buttonPanel, "South" );
  24. dialog.pack();
  25. dialog.setLocationRelativeTo(view);
  26. dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
  27. dialog.setVisible(true);
  28. ok.addActionListener(this);
  29. cancel.addActionListener(this);


 
J'ai tout virré, sauf le Jpanel et les deux boutons.
 
Si maintenant j'ajoute ça :
 

Code :
  1. void actionPerformed(e)
  2. {
  3. if(e.getSource() != cancel)
  4. {
  5.    dialog.dispose();
  6. }
  7. // dialog.dispose();
  8. }


 
Le bouton cancel est inactif.
 
Si à la place j'ai ça :
 

Code :
  1. void actionPerformed(e)
  2. {
  3. if(e.getSource() != cancel)
  4. {
  5.   //  dialog.dispose();
  6. }
  7. dialog.dispose();
  8. }


 
C'est le bouton OK qui devient inactif
 
 
Donc le test est bon.
 
MAIS, si je mets n'importe quoi avant le dialog.dispose(); comme ça par exemple :
 

Code :
  1. void actionPerformed(e)
  2. {
  3. if(e.getSource() != cancel)
  4. {
  5.   textArea.setSelectedText("salut !" );
  6. }
  7. String test="machin";
  8. dialog.dispose();
  9. }


 
Le bouton Ok n'a plus d'effet. Je veux dire par là qui s'allume si je vais dessus et que je clique dessus. Mais le Jpanel ne se ferme plus...  :heink:  
 
Je sens que si j'arrive à comprendre ça, le reste ne devrait pas me poser de problème...


Message édité par Hermes le Messager le 27-10-2003 à 20:18:42
Reply

Marsh Posté le 27-10-2003 à 20:20:09    

Je suis en train d'éditer le message.
 
textArea.setSelectedText("salut !" ) marche, y compris au sein d'un void, mais le problème, c'est que dès que je le mets là où je l'ai mis, il ne marche plus.
 
sniff...

Reply

Marsh Posté le 27-10-2003 à 20:21:27    

the real moins moins a écrit :

http://www.jedit.org/42docs/api/or [...] ng.String)
 
Replaces the selection at the caret with the specified text. If there is no selection at the caret, the text is inserted at the caret position.
 
vérifie la position du "caret" :o
 


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-10-2003 à 20:23:12    

tu déclares ta variable "test" dans ta classe et non dans ta méthode et elle sera accessible plus tard dans ton instance ?

Reply

Marsh Posté le 27-10-2003 à 20:29:00    

nraynaud a écrit :

tu déclares ta variable "test" dans ta classe et non dans ta méthode et elle sera accessible plus tard dans ton instance ?


 
En fait, cette variable était à un moment donné une tentative de récupération du actionPerformed.
 
Pourquoi ?
 
Pour ça :
 
 

Code :
  1. textArea.setSelectedText("Salut" );

tout seul marche.
 

Code :
  1. void delire()
  2. {
  3. textArea.setSelectedText("Salut" );
  4. }
  5. delire();


 
marche aussi
 
Mais  
 

Code :
  1. void actionPerformed(ActionEvent e)
  2. {
  3. if(e.getSource() == this.ok)
  4. {
  5.   textArea.setSelectedText("Salut" );
  6. }
  7. else
  8. {
  9. dialog.dispose();
  10. }
  11. }


 
ne marche pas ALORS QUE si je joue avec dialog.dispose, je testes effectivement que je peux voir si OK ou Cancel ont été cliqué.
 
 :cry:  
 

Reply

Marsh Posté le 27-10-2003 à 20:30:20    

La preuve :
 
 
Code :
 
 

Code :
  1. void actionPerformed(e)
  2.   {
  3.      if(e.getSource() != cancel)
  4.      {
  5.          dialog.dispose();
  6.      }
  7.      // dialog.dispose();
  8.   }

 
 
 
Le bouton cancel est inactif.
 
Si à la place j'ai ça :
 
 
Code :
 
 

Code :
  1. void actionPerformed(e)
  2.   {
  3.      if(e.getSource() != cancel)
  4.      {
  5.         //  dialog.dispose();
  6.      }
  7.      dialog.dispose();
  8.   }

 
 
 
C'est le bouton OK qui devient inactif
 
 
Donc le test est bon.

Reply

Marsh Posté le 27-10-2003 à 20:53:59    

PUTAIN !!!!!!!!!! J'ai trouvé, c'est un problème interne à jEdit.
 
Il faut faire une MACRO et l'appeler depuis le Xinsert, et le bug disparait !!!!!
 
Je peux continuer à bosser maintenant... pfffff !!

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed