2017-01-03 3 views
0

Так что моя проблема связана с JComboBoxs и ActionListeners. Я сделаю новый упрощенный код, чтобы попытаться представить проблему из моего исходного кода. Я хочу, чтобы JComboBox добавил JComboBox, который затем добавит третий JComboBox и так далее. Каждый раз, когда я нажимаю на них, я хочу, чтобы они меняли содержимое в зависимости от того, что показывает предыдущий JComboBox.JComboBox участвует в других JComboBoxes ActionListeners

В любом случае моя самая большая проблема на данный момент заключается в том, что когда я выбираю что-то в первом JComboBox "racebox". Он не только добавляет «infantrybox» к панели, но также добавляет все другие JComboBoxes, которые у меня есть, вместо добавления их только один раз, когда я выбираю что-то в соответствующем JComboBox.

Это как когда я выбираю что-то в расе, он начинает читать код из любого другого actionPerformed.

Одна вещь, что JComboBoxes добавляется назад после добавления «гонки». Первое: racebox Второе: infantrynmrbox Третье: 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()); 
     } 
    }); 
    ... 
} 

ответ

1

Не продолжайте добавлять поля со списком на панели.

Вместо этого вы просто изменяете модель существующего комбинированного блока.

Например:

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

Спасибо за ваш ответ. Некоторые из этого кода я вообще не понимаю. Извините, мой код немного неясен. Коробки добавляются только один раз в исходный код. Но проблема в том, что они добавляются все сразу. Я хочу, чтобы все они были добавлены, но не все одновременно. – Richovic

+0

@Richovic, 'Но проблема в том, что они добавляются все сразу.' - добавьте ActionListener в поле со списком ПОСЛЕ того, как вы добавите данные в поле со списком. Если вам нужна дополнительная помощь, разместите надлежащую [mcve], которая демонстрирует проблему. – camickr

+0

Ничего, я понял. Я использовал «setModel» (новый DefaultComboBoxModel()); в некотором смысле, и я получил его работу. Спасибо. – Richovic

Смежные вопросы