2012-12-11 3 views
0

1000 응용 프로그램을 선택할 수 있도록 응용 프로그램을 원합니다.두 개의 JComboBox가 있습니다. 첫 번째 것은 두 번째 것을 변경하지 않습니다

저는 1000 개의 프리셋이 100 개의 프리셋 10 개의 뱅크로 나뉘어졌습니다.

두 개의 JCombobox를 사용하고 싶습니다. 두 번째 JCombobox는 첫 번째 뱅크 목록 (10 중 1 개 선택)입니다. 두 번째는 100 개의 사전 설정을 갖습니다.

첫 번째 뱅크 중 하나를 선택한 후에는 두 번째 뱅크에서 사전 설정 목록을 새로 고치지 않습니다.

있어서 GetXML.setBankFromBankCombo() 가변 뱅크 변화된다. GetXML은 XML 파일을 읽는 클래스입니다. System.out.println()을 인쇄하여 알 수 있듯이 JCombo의 사전 설정이 변경되지 않는 이유는 알 수 없습니다.

코드를 명확하게하기 위해 은행 및 프리셋 수를 3 개로 제한했습니다.

screenshot1screenshot2

클래스 FrameCombo :

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import javax.swing.event.*; 

public class FrameCombo extends JPanel { 

    private Presets comboPresets; 
    private JComboBox comboBank; 
    private int activeBank; 

    public FrameCombo() { 

     activeBank = 1; 
     setPreferredSize(new Dimension(410, 200)); 


     /** 
     * Bank Combo 
     * 
     */ 
     String[] banks = { 
      "Bank 0", 
      "Bank 1", 
      "Bank 2" 
     }; 


     comboBank = new JComboBox(banks); 
     comboBank.setEditable(true); 
     comboBank.setPreferredSize(new Dimension(180, 30)); 
     comboBank.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       JComboBox cb = (JComboBox) e.getSource(); 
       activeBank = cb.getSelectedIndex(); 
       comboPresets.setBank(activeBank); 
       System.out.println("FrameCombo.activeBank = " + activeBank); 

      } 
     }); 
     JPanel bankPanel = new JPanel(); 
     bankPanel.setPreferredSize(new Dimension(180, 100)); 
     bankPanel.add(new JLabel("Banks")); 
     bankPanel.add(comboBank); 
     add(bankPanel); 





     /** 
     * Presets Combo 
     * 
     */ 
     comboPresets = new Presets(); 
     comboPresets.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       //presets do something 
      } 
     }); 

     JPanel presetPanel = new JPanel(); 
     presetPanel.setPreferredSize(new Dimension(180, 110)); 
     presetPanel.add(new JLabel("Presets")); 
     presetPanel.add(comboPresets); 
     add(presetPanel); 
    } 

    public void setBank(int value) { 
     activeBank = value; 
    } 

    public int getBank() { 
     return activeBank; 
    } 

    public static void main(String[] args) { 
     final String title = " Frame Combo"; 
     System.out.println(title); 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame(title); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.getContentPane().add(new FrameCombo()); 

       frame.setResizable(false); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

클래스 사전 :

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class Presets extends JPanel 
     implements ActionListener { 

    private int bank; 
    private int value; 
    private int[] ctrlIdx = new int[3]; 
    private int controller; 
    private ChangeEvent changeEvent = null; 
    private EventListenerList listenerList = new EventListenerList(); 
    private GetXMLPresets dane; 
    private String[][] patern; 
    private String[] itemName; 
    public MainWindow model = new MainWindow(); 
    JComboBox item; 

    public Presets() { 


     dane = new GetXML(bank); 
     patern = dane.ct; // controllers 
     itemName = dane.lb; // name 
     System.out.println("Presets() " + bank); 
     JComboBox item = new JComboBox(itemName); 
     item.setSelectedIndex(0); 
     item.addActionListener(this); 
     item.setPreferredSize(new Dimension(180, 30)); 
     add(item); 
     setPreferredSize(new Dimension(210, 40)); 
    } 

    public void setValue(int c, int v) { 
     controller = c; 
     value = v; 
     ctrlIdx[controller] = value; 
     repaint(); 
     fireChangeEvent(); 
    } 

    public int getController() { 
     return controller; 
    } 

    public int getValue(int c) { 
     int w = (int) ctrlIdx[c]; 
     return (int) w; 
    } 

    public void setBank(int value) { 
     bank = value; 
     dane.setBankFromBankCombo(bank); 
     repaint(); 
     fireChangeEvent(); 
    } 

    public int getBank() { 
     return bank; 
    } 

    public void actionPerformed(ActionEvent e) { 
     JComboBox cb = (JComboBox) e.getSource(); 
     String item = (String) cb.getSelectedItem(); 
     int indeks = cb.getSelectedIndex(); 

     for (int i = 0; i < itemName.length; i++) { 
      for (int j = 0; j < patern[i].length; j++) { 
       model.setController(j, Integer.parseInt(patern[indeks][j])); 
       setValue(j, Integer.parseInt(patern[indeks][j])); 
      } 
     } 

    } 

    public void addChangeListener(ChangeListener cl) { 
     listenerList.add(ChangeListener.class, cl); 
    } 

    public void removeChangeListener(ChangeListener cl) { 
     listenerList.remove(ChangeListener.class, cl); 
    } 

    protected void fireChangeEvent() { 

     Object[] listeners = listenerList.getListenerList(); 

     for (int i = listeners.length - 2; i >= 0; i -= 2) { 
      if (listeners[i] == ChangeListener.class) { 

       if (changeEvent == null) { 
        changeEvent = new ChangeEvent(this); 
       } 
       ((ChangeListener) listeners[i + 1]).stateChanged(changeEvent); 
      } 
     } 
    } 
} 

클래스 은 GetXML :

,451,515,
import java.io.*; 
import javax.swing.*; 
import javax.xml.xpath.*; 
import org.w3c.dom.*; 
import org.xml.sax.InputSource; 

public class GetXML extends JPanel { 

    private int numpresets; 
    public String[] lb = new String[3]; 
    public String[][] ct = new String[3][3]; 
    private int bank; 

    public GetXML(int a) { 

     bank = a; 
     try { 

      XPathFactory factory = XPathFactory.newInstance(); 
      XPath xPath = factory.newXPath(); 

      NodeList patches = (NodeList) xPath.evaluate("/bank/patch", 
        new InputSource(new FileReader(new File("patches/presets" + bank + ".xml").getAbsolutePath())), 
        XPathConstants.NODESET); 
      setNumPresets(patches.getLength()); 
      String[] labels = new String[numpresets]; 
      String[][] ctrl = new String[numpresets][3]; 

      for (int i = 0; i < numpresets; i++) { 
       Element patch = (Element) patches.item(i); 
       String controllerName = xPath.evaluate("controllers/name/text()", patch); 

       for (int j = 0; j < 3; j++) { 
        ctrl[i][j] = xPath.evaluate("controllers/c" + Integer.toString(j + 1) + "/text()", patch); 
        ct[i][j] = ctrl[i][j]; 
       } 
       labels[i] = controllerName; 
       lb[i] = labels[i]; 
      } 
     } catch (FileNotFoundException fnfe) { 
      System.out.println("FileNotFoundException " + fnfe); 
      fnfe.printStackTrace(); 
     } catch (IOException ioe) { 
      System.out.println("IOException " + ioe); 
     } catch (Exception eio) { 
      System.out.println("eio " + eio); 
     } 

    } 

    public void setBank(String[] b) { 
     lb = b; 
    } 

    public String[] getBank() { 
     return lb; 
    } 

    public void setPreset(String[][] c) { 
     ct = c; 
    } 

    public String[][] getPreset() { 
     return ct; 
    } 

    public void setNumPresets(int a) { 
     numpresets = a; 
    } 

    public int getNumPresets() { 
     return numpresets; 
    } 

    public void setBankFromBankCombo(int id) { 
     System.out.println("GetXMLPresets.setIDFromBankCombo() " + id); 
     bank = id; 


    } 
} 

하나의 XML 파일의 샘플 Presets0.xml는

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<bank bid="0"> 
    <patch pid="1"> 
     <controllers> 
      <name>bank 0: preset 1</name> 
      <c1>55</c1> 
      <c2>3</c2> 
      <c3>24</c3> 
     </controllers> 
    </patch> 
    <patch pid="2"> 
     <controllers> 
      <name>bank 0: preset 2</name> 
      <c1>33</c1> 
      <c2>1</c2> 
      <c3>45</c3> 
     </controllers> 
    </patch> 
    <patch pid="3"> 
     <controllers> 
      <name>bank 0: preset 3</name> 
      <c1>43</c1> 
      <c2>23</c2> 
      <c3>39</c3> 
     </controllers> 
    </patch> 
</bank> 
+1

는이 작업 [예]를 참조하십시오 자세한 내용은 How to Use Comb Boxes를 살펴 보자 (http://stackoverflow.com/a/3191882/230513). – trashgod

답변

2

매우 간단합니다, 당신은 데이터가로드되었지만 것을 의미하는 Preset의 콤보 상자의 내용을 변경하지했습니다 , 그것은 콤보 상자 모델에 적용되지 않았기 때문에 콤보 상자는 새로운 데이터가 있음을 알지 못합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 trashgod를 준 예제를 사용했고 그것을 수정했다. 하지만 GetXML 클래스에 뭔가 잘못되었습니다. 이 클래스를 수정해야했습니다. 간단히 말해 XML 파일의 모든 데이터를 3 차원 배열에 저장하는 것입니다. 이 작업을 수행 할 수 있습니까? 이것이 권장되는 방법이 아닌 경우? – auroris

관련 문제