2017-01-03 1 views
0

Donc, mon problème est avec JComboBoxs et ActionListeners. Je vais faire un nouveau code simplifié pour essayer de représenter le problème de mon code original. Je veux un JComboBox pour ajouter un JComboBox qui ajoutera alors un troisième JComboBox et ainsi de suite. Chaque fois que je clique dessus, je veux qu'ils changent le contenu en fonction de ce que montre le JComboBox précédent.JComboBox engageant d'autres JComboBoxes ActionListeners

De toute façon mon plus gros problème pour l'instant est que quand je sélectionne quelque chose dans la première "boîte de course" JComboBox. Il ajoute non seulement "infantrybox" au panneau, il ajoute aussi toutes les autres JComboBox que j'ai, au lieu de les ajouter seulement une fois que je sélectionne quelque chose dans JComboBox respectif. C'est comme quand je sélectionne quelque chose dans Racebox, il commence à lire le code de toutes les actions exécutées. Une chose bizarre est que les JComboBoxes sont ajoutés à l'envers après avoir ajouté "racebox". Première: Racebox Deuxième: infantrynmrbox Troisième: infantrybox

... 
public void Attacker(){ 

    racebox = new JComboBox(array); 
    infantrybox = new JComboBox(); 
    infantrynmrbox = new JComboBox(); 

    panel.add(racebox); 
    panel.revalidate(); 
    panel.repaint(); 

    racebox.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      JComboBox cb = (JComboBox)e.getSource(); 
      race = (String)cb.getSelectedItem(); 

      infantrybox.removeAllItems(); 
      for(String s : otherarray){ 
       infantrybox.addItem(s); 
      } 

      panel.add(infantrybox); 
      panel.revalidate(); 
      panel.repaint(); 
     } 
    }); 

    infantrybox.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      JComboBox cb = (JComboBox)e.getSource(); 
      infantry = (String)cb.getSelectedItem(); 

      infantrynmrbox.removeAllItems(); 
      for(String s : nmr){ 
       infantrynmrbox.addItem(s); 
       System.out.println(s + " "); 
      } 

      panel.add(infantrynmrbox); 
      panel.revalidate(); 
      panel.repaint(); 
     } 
    }); 

    infantrynmrbox.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      JComboBox cb = (JComboBox)e.getSource(); 
      infantrynmr = Integer.parseInt((String)cb.getSelectedItem()); 
     } 
    }); 
    ... 
} 

Répondre

1

Ne pas continuer à ajouter des boîtes combo au panneau.

Au lieu de cela, il suffit de changer le modèle de la zone de liste déroulante existante.

Par exemple:

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.plaf.basic.*; 

public class ComboBoxTwo extends JPanel implements ActionListener 
{ 
    private JComboBox<String> mainComboBox; 
    private JComboBox<String> subComboBox; 
    private Hashtable<String, String[]> subItems = new Hashtable<String, String[]>(); 

    public ComboBoxTwo() 
    { 
     String[] items = { "Select Item", "Color", "Shape", "Fruit" }; 
     mainComboBox = new JComboBox<String>(items); 
     mainComboBox.addActionListener(this); 

     // prevent action events from being fired when the up/down arrow keys are used 
     mainComboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); 
     add(mainComboBox); 

     // Create sub combo box with multiple models 

     subComboBox = new JComboBox<String>(); 
     subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4 
     add(subComboBox); 

     JButton arrow = SwingUtils.getDescendantOfType(JButton.class, subComboBox, "Text", ""); 
     Dimension d = arrow.getPreferredSize(); 
     System.out.println(arrow.getClass()); 
     System.out.println(d); 
     d.width = 100; 
     arrow.setPreferredSize(d); 

     String[] subItems1 = { "Select Color", "Red", "Blue", "Green" }; 
     subItems.put(items[1], subItems1); 

     String[] subItems2 = { "Select Shape", "Circle", "Square", "Triangle" }; 
     subItems.put(items[2], subItems2); 

     String[] subItems3 = { "Select Fruit", "Apple", "Orange", "Banana" }; 
     subItems.put(items[3], subItems3); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     String item = (String)mainComboBox.getSelectedItem(); 
     Object o = subItems.get(item); 

     if (o == null) 
     { 
      subComboBox.setModel(new DefaultComboBoxModel()); 
     } 
     else 
     { 
      subComboBox.setModel(new DefaultComboBoxModel((String[])o)); 
     } 
    } 

    private static void createAndShowUI() 
    { 
     try 
     { 
//   UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (Exception e) { } 
     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new ComboBoxTwo()); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+0

Merci pour votre réponse. Une partie de ce code je ne comprends pas du tout. Désolé, mon code est un peu flou. Les boîtes ne sont ajoutées qu'une seule fois dans le code d'origine. Mais le problème est qu'ils sont ajoutés tout à la fois. Je veux qu'ils soient tous ajoutés mais pas tous en même temps. – Richovic

+0

@Richovic, 'Mais le problème est qu'ils sont ajoutés tous en même temps. '- ajouter le ActionListener à la zone de liste déroulante APRÈS que vous ajoutez les données à la zone de liste déroulante. Si vous avez besoin de plus d'aide, postez un [mcve] approprié qui démontre le problème. – camickr

+0

Peu importe, je l'ai maintenant. J'ai utilisé le "setModel (new DefaultComboBoxModel());" à certains égards et je l'ai fait fonctionner. Je vous remercie. – Richovic