【问题标题】:JComboBox Select and Item and Based off of the selection display a new listJComboBox Select and Item and Based off of the selection display a new list
【发布时间】:2015-04-24 20:04:49
【问题描述】:

我有以下代码,以便根据用户选择显示一个列表:

    private class SheepTypeListHandler implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        JComboBox<String> cb = (JComboBox<String>)(e.getSource());
        if (cb.getSelectedItem().equals(sheepType[0])) {
            for (String item : eweClass )
            sheepClassCB.addItem(item);
        }
        else if (cb.getSelectedItem().equals(sheepType[1])) {
            for (String item : ramClass )
                sheepClassCB.addItem(item);
            for (String item : weight3 )
                weightCB.addItem(item);
        }
        else if (cb.getSelectedItem().equals(sheepType[2])) {
            for (String item : lambClass )
                sheepClassCB.addItem(item);
        }
    }
    } //End SheepTypeListHandler class

目前,根据您选择的内容,会弹出一个新列表。但是,如果您改变主意并选择一个新项目,而不是覆盖现有的内容,它只会将新列表添加到第一个列表的底部。

例如: 如果用户选择sheepType[2],则会出现以下列表:

Finishing
Early-weaned

现在如果他们改变主意并选择sheepType[0]而不是这个列表:

Maintenance
Nonlactating, first 15 weeks gestation
Last 6 wks gestation OR Last 8 wks lactation suckling singles
First 8 wks lactation suckling singles OR last 8 wks lactation suckling twins
First 8 weeks lactation suckling twins
Replacement lambs and yearlings

我明白了:

Finishing
Early-weaned
Maintenance
Nonlactating, first 15 weeks gestation
Last 6 wks gestation OR Last 8 wks lactation suckling singles
First 8 wks lactation suckling singles OR last 8 wks lactation suckling twins
First 8 weeks lactation suckling twins
Replacement lambs and yearlings

如何更改当前代码以在进行新选择时覆盖而不是仅添加到列表中? 谢谢!

更新: 将我的部分代码编辑为以下内容:

private class SheepTypeListHandler implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        sheepClassCB.removeAllItems(); 
        if (sheepListCB.getSelectedItem().equals(sheepType[0])) {
            //sheepClassCB.removeAllItems(); //This did not work
            for (String item : eweClass ){
                sheepClassCB.addItem(item);
            }
        }
        else if (sheepListCB.getSelectedItem().equals(sheepType[1])) {
            for (String item : ramClass )
                sheepClassCB.addItem(item);
            for (String item : weight3 )
                weightCB.addItem(item);
        }
        else if (sheepListCB.getSelectedItem().equals(sheepType[2])) {
            for (String item : lambClass )
                sheepClassCB.addItem(item);
        }
    }
}

现在我第一次从列表中选择一个项目时它可以工作。但是如果我重新选择一个不同的项目,它会显示一个空列表。

【问题讨论】:

  • 所以在添加数据之前清除列表。查看您的组件的 API 以查看它是否具有此方法。否则,请查看组件模型的 API 以了解方法是什么。
  • sheepClassCB是什么类型?
  • sheepClassCB 是从字符串数组列表生成的 JComboBox:JComboBox&lt;String&gt; sheepListCB = new JComboBox&lt;&gt;(sheepType);
  • 查看我的答案并找出我的工作代码和你的代码之间的区别。

标签: java swing user-interface jcombobox


【解决方案1】:

您似乎错过了sheepClassCB.removeAllItems() 这一行。我根据你的代码做了一个简单的例子:

public class ListEmpty extends JFrame {

    JComboBox<String> changingCB = new JComboBox<>();
    JComboBox<String> unchangingCB = new JComboBox<>();

    String[] numbers = new String[] {"1", "2", "3"};
    String[] letters = new String[] {"a", "b", "c"};
    String[] symbols = new String[] {"!", "@", "#"};

    ListEmpty() {

        unchangingCB.addItem("Numbers");
        unchangingCB.addItem("Letters");
        unchangingCB.addItem("Symbols");
        unchangingCB.addActionListener(new SheepTypeListHandler());

        getContentPane().add(unchangingCB, BorderLayout.LINE_START);
        getContentPane().add(changingCB, BorderLayout.CENTER);

        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    private class SheepTypeListHandler implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            changingCB.removeAllItems(); // Compare with removing this line.
            if (unchangingCB.getSelectedItem().equals("Numbers")) {
                for (String item : numbers)
                    changingCB.addItem(item);
            } else if (unchangingCB.getSelectedItem().equals("Letters")) {
                for (String item : letters)
                    changingCB.addItem(item);
            } else if (unchangingCB.getSelectedItem().equals("Symbols")) {
                for (String item : symbols)
                    changingCB.addItem(item);
            }
        }
    }

    public static void main(String[] args) {

        new ListEmpty();
    }
}

您可能需要考虑使用switch 语句而不是多个if-else 语句。

【讨论】:

  • 上述答案有效,但我发现在多个 ComboBox 的情况下,这些 ComboBox 的工作基于另一个 ComboBox 中所做的不同选择,您还需要在对一个 ComboBox 执行操作之前关闭 ActionListener,然后再打开它动作完成后重新打开。否则它仍然无法正常工作。
  • @tinkerton101 没有看到“基于另一个 ComboBox 中所做的不同选择的多个 ComboBox”的代码示例,我无法给出正确的回应。我上面的回答是针对您最初的问题“如何更改当前代码以在进行新选择时覆盖而不是仅添加到列表中?”。
  • 问题已解决。添加您的代码解决了最初的问题,然后在多个必须相互交互的组合框的情况下添加我的额外代码。
  • @tinkerton101 好的,但是打开和关闭ActionListeners 通常意味着设计中出现了问题。不过,不管对你有用。
猜你喜欢
  • 2022-12-28
  • 1970-01-01
  • 2022-11-20
  • 2022-12-02
  • 2022-12-02
  • 2022-12-02
  • 2010-09-28
相关资源
最近更新 更多