2017-01-03 1 views
0

그래서 내 문제는 JComboBoxs 및 ActionListeners입니다. 원본 코드에서 문제를 표현하기 위해 새로운 간단한 코드를 작성하겠습니다. JComboBox에 JComboBox를 추가하여 세 번째 JComboBox를 추가하면됩니다. 나는 그들을 클릭 할 때마다 이전 JComboBox의 내용에 따라 내용을 변경하기를 원합니다.JComboBox 다른 JComboBoxes ActionListeners 약식

어쨌든 가장 큰 문제는 내가 첫 번째 JComboBox "racebox"에서 무언가를 선택할 때입니다. 패널에 "infantrybox"를 추가 할뿐만 아니라, JComboBox에서 무언가를 선택하기 만하면되는 대신 다른 모든 JComboBoxes를 추가합니다.

racebox에서 뭔가를 선택하면 다른 모든 actionPerformed 코드를 읽는 것과 같습니다.

"racebox"를 추가 한 후 JComboBoxes가 뒤로 추가된다는 것이 하나의 큰 일입니다. 첫째 : racebox 둘째 : infantrynmrbox 셋째 :

... 
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

패널에 콤보 상자를 추가 보관하지 마십시오 infantrybox.

대신 기존 콤보 상자의 모델 만 변경하면됩니다. 예를 들어

:

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 (new DefaultComboBoxModel());"을 사용했다. 어떤면에서 저는 그것을 작동 시켰습니다. 고맙습니다. – Richovic