2012-12-11 97 views
0

我希望我的應用程序能夠選擇1000個預設。兩個JComboBoxes。第一個不會更改第二個

所以我想到了1000個預設分爲10個100個預設組。

我想使用兩個JComboboxes,第一個是銀行列表(選擇10)。 第二個將有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

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

另見本工作[示例](http://stackoverflow.com/a/3191882/230513)。 – trashgod

回答

2

相當簡單,你沒有改變Preset的組合框的內容,也就是說,雖然數據已經加載,它尚未應用於組合框模型,所以組合框不知道它具有要顯示的新數據。

看看How to Use Comb Boxes更多細節

+0

感謝您的回覆和提示。我使用了一個給垃圾回收的例子,我修改了它。 但是我的類GetXML出錯了。 我不得不修改這個類。簡單地說,將所有來自XML文件的數據放入三維數組中。 我可以這樣做嗎? 如果這不是推薦的方法? – auroris

相關問題