0

アプリケーションで 1000 個のプリセットを選択できるようにしたいと考えています。

そこで、1000 個のプリセットを 100 個のプリセットの 10 バンクに分割するというアイデアを得ました。

2 つの JCombobox を使用したいと思います。最初の JCombobox はバンクのリストです (10 のうち 1 つを選択)。2 番目のものには 100 個のプリセットがあります。

最初のバンクの 1 つを選択した後、2 番目のプリセットのリストが更新されません。

メソッドGetXML.setBankFromBankCombo()が変数bankを変更しています。(GetXML は XML ファイルを読み取るクラスです)。System.out.println() を出力するとわかるように、JCombo のプリセットが変更されない理由がわかりません。

コードをわかりやすくするために、バンクとプリセットの数を 3 つに制限しました。

スクリーン ショット1 スクリーンショット2

クラス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;


    }
}

および 1 つの 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>
4

1 に答える 1

2

のコンボ ボックスの内容は変更していません。Presetつまり、データが読み込まれている間はコンボ ボックス モデルに適用されていないため、コンボ ボックスは新しいデータがあることを認識していません。表示する。

詳細については、コーム ボックスの使用方法をご覧ください。

于 2012-12-11T19:40:27.863 に答える