【问题标题】:Options in second comboBox dependent on first comboBox [duplicate]第二个组合框中的选项取决于第一个组合框[重复]
【发布时间】:2013-01-10 15:11:29
【问题描述】:

可能重复:
Dynamic JComboBoxes
how to control a combo box by using another combo box swing

    // model drop-down      
    final JComboBox modelName = new JComboBox();
    modelName.addItem("Choose One...");
    modelName.addItem("Hypercom");
    modelName.addItem("Deja Voo");
    modelName.addItem("Nurit");
    modelName.addItem("Verifone");
    int modelIndex = modelName.getSelectedIndex();      

    modelPanel.add(modelName);

我在下面要做的是让第二个组合框上的选项根据第一个选择的内容而改变......但它没有这样做。无论我在顶部组合框中选择什么,第二个的选项都不会改变......我错过了什么?

            // Terminal Panel (within Panel1)
    JPanel termPanel = new P(15);
    termPanel.setBackground(Color.WHITE);
    panel1.add(termPanel);

    final JComboBox termName = new JComboBox();

    if (modelIndex == 1) {              
        termName.addItem("Choose One...");
        termName.addItem("T7Plus");
        termName.addItem("4205");
        termName.addItem("4210");
        termName.addItem("4220");           

    } else if (modelIndex == 2) {           
        termName.addItem("Choose One...");
        termName.addItem("M-3");
        termName.addItem("X-5");
        termName.addItem("X-8");
        termName.addItem("V Series");

    } else if (modelIndex == 3) {
        termName.addItem("Choose One...");
        termName.addItem("2085");
        termName.addItem("3020/8320");
        termName.addItem("8400");
        termName.addItem("8000/8020");

    } else if (modelIndex == 4) {
        termName.addItem("Choose One...");
        termName.addItem("37 Dial");
        termName.addItem("37 IP");
        termName.addItem("VX Dial");
        termName.addItem("VX IP");

    } else {
        termName.addItem("Select Model Above");
    }

    termName.getSelectedIndex();
    termPanel.add(termName);

更新

我更新了代码,但现在我得到了一个 nullPoint 异常错误...这里是它的位置:

    final DefaultComboBoxModel termModel = new DefaultComboBoxModel(new String[]{"Choose One...", "Hypercom", "DejaVoo", "Nurit", "Verifone"});

...

// model drop-down      
    modelName.setModel(termModel);  // NULLPOINT EXCEPTION HERE

    modelName.addActionListener (new ActionListener () {
        public void actionPerformed(ActionEvent e) {
            if ("Hypercom".equals(modelName.getSelectedItem())){
                termName.setModel(hSpecModel);    
            } else if ("Deja Voo".equals(modelName.getSelectedItem())){
                termName.setModel(dSpecModel);    
            } else if ("Nurit".equals(modelName.getSelectedItem())){
                termName.setModel(nSpecModel);
            } else if ("Verifone".equals(modelName.getSelectedItem())){
                termName.setModel(vSpecModel);
            } else {
                termName.setModel(slctAbove);
            }
        }
    });

    modelPanel.add(modelName);

【问题讨论】:

标签: java swing


【解决方案1】:

你应该添加ActionListener,它可以改变第二个JComboBox的内容。此外,您应该考虑在 Map 中链接模型名称和术语名称。请看我的例子:

class TwoComboboxFrame extends JFrame {

    private static final long serialVersionUID = 1L;

    private Map<String, List<String>> modelNameTermName = new LinkedHashMap<String, List<String>>();

    private JComboBox<String> termNameComboBox;

    public TwoComboboxFrame() {
        init();
        buildDataModel();

        JPanel panel = createAndAddPanel();
        buildModelNameComboBox(panel);
        buildTermNameComboBox(panel);
    }

    private void buildTermNameComboBox(JPanel panel) {
        termNameComboBox = new JComboBox<String>();
        termNameComboBox.addItem("Select Model Above");
        panel.add(termNameComboBox);
    }

    private void buildModelNameComboBox(JPanel panel) {
        JComboBox<String> modelName = new JComboBox<String>();
        modelName.addItem("Choose One...");
        for (String value : modelNameTermName.keySet()) {
            modelName.addItem(value);
        }
        panel.add(modelName);
        modelName.addActionListener(new ActionListener() {

            @SuppressWarnings("unchecked")
            @Override
            public void actionPerformed(ActionEvent e) {
                JComboBox<String> source = (JComboBox<String>) e.getSource();
                String selectedValue = source.getSelectedItem().toString();
                List<String> termNames = modelNameTermName.get(selectedValue);
                termNameComboBox.removeAllItems();
                if (termNames == null) {
                    termNameComboBox.addItem("Select Model Above");
                } else {
                    termNameComboBox.addItem("Choose One...");
                    for (String name : termNames) {
                        termNameComboBox.addItem(name);
                    }
                }
            }
        });
    }

    private void buildDataModel() {
        modelNameTermName.put("Hypercom",
                Arrays.asList("T7Plus", "4205", "4210", "4220"));
        modelNameTermName.put("Deja Voo",
                Arrays.asList("M-3", "X-5", "X-8", "V Series"));
        //Add other data
    }

    private void init() {
        setTitle("Two comboboxex");
        setSize(300, 200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    }

    private JPanel createAndAddPanel() {
        JPanel panel = new JPanel(true);
        panel.setLayout(new GridLayout(1, 2));
        add(panel);
        return panel;
    }
}

使用示例:

public static void main(String[] args) throws Exception {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            TwoComboboxFrame ex = new TwoComboboxFrame();
            ex.setVisible(true);
        }
    });
}

【讨论】:

  • 如何让 JComboBox 成为通用的?我试过这个,它抱怨这个对象不是通用的。
  • 您使用的是哪个版本的 Java?请参阅文档:docs.oracle.com/javase/8/docs/api/javax/swing/JComboBox.html 这是一个泛型类。
  • 我使用的是 jdk 1.6。我一定做错了什么。将再次检查。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多