java - JComboBox 和 Action、新模型等

标签 java swing events actionlistener jcombobox

我有一些奇怪的事情,我无法理解为什么会发生。 我搜索了网络,包括这里,但找不到答案。 我有 3 个 ComboBox,其中 2 个后面跟着 1 个。 它是一个小程序转换工具。 每次我在主组合框中选择要转换的字段时,都会加载其他两个字段以进行转换。但每次加载后,我都会选择要转换的内容,从而影响 ComboBox。 这是代码: //这是对象//////

     MyEvent handler = new MyEvent();

    MainCombo = new JComboBox(issueArray);
    MainCombo.setBounds(120, 50, 120, 20);
    MainCombo.addActionListener(handler);
    add(MainCombo);

    Combo1 = new JComboBox(Angle);
    Combo1.setBounds(120, 90, 120, 20);
    Combo1.addActionListener(handler);
    add(Combo1);

    Combo2 = new JComboBox(Angle);
    Combo2.setBounds(320, 90, 120, 20);
    Combo2.addActionListener(handler);
    add(Combo2);

    //The Method To Change Values In The ComboBox 
     public void loadIssueParam(String Issue){
    Combo1.removeAllItems();
    Combo2.removeAllItems();
    switch (Issue) {
        case "Angle":
            {
                DefaultComboBoxModel newModel= new DefaultComboBoxModel(Angle);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Area":
            {
                DefaultComboBoxModel   newModel= new DefaultComboBoxModel(Area);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Data":
            {
                DefaultComboBoxModel  newModel= new DefaultComboBoxModel(Data);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Energy":
            {
                DefaultComboBoxModel   newModel= new DefaultComboBoxModel(Energy);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Force":
            {
                DefaultComboBoxModel      newModel= new DefaultComboBoxModel(Force);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Length":
            {
                DefaultComboBoxModel      newModel= new DefaultComboBoxModel(Length);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Mass":
            {
                DefaultComboBoxModel        newModel= new DefaultComboBoxModel(Mass);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Power":
            {
                DefaultComboBoxModel       newModel= new DefaultComboBoxModel(Power);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Pressure":
            {
                DefaultComboBoxModel  newModel= new DefaultComboBoxModel(Pressure);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Speed":
            {
                DefaultComboBoxModel  newModel= new DefaultComboBoxModel(Speed);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Temperature":
            {
                DefaultComboBoxModel  newModel= new DefaultComboBoxModel(Temperature);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Time":
            {
                DefaultComboBoxModel  newModel= new DefaultComboBoxModel(Time);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
        case "Volume":
            {
                DefaultComboBoxModel newModel= new DefaultComboBoxModel(Volume);
                Combo1.setModel(newModel);
                Combo2.setModel(newModel);
                break;
            }
    }

    /// I THINK MAYBE THIS METHOD HAVE SOMETHING TO DO WITH IT - OR I NEED SOME HOW TO
    /// CLEAR THE SELECTION.



      private class MyEvent implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent event){
        if(event.getSource()==MainCombo){
        JComboBox cb=(JComboBox)event.getSource();
        IssueBox=(String)cb.getSelectedItem();
        loadIssueParam(IssueBox);
    } 
        if(event.getSource()==Combo1){
        JComboBox cb=(JComboBox)event.getSource();
        fromBox=(String)cb.getSelectedItem();
    } 
        if(event.getSource()==Combo2){
        JComboBox cb=(JComboBox)event.getSource();
        toBox=(String)cb.getSelectedItem();
    }
    }
}

每次我进行子选择都会影响两个子组合框。

感谢您的帮助 尼罗

最佳答案

啊,看了你的代码我现在明白你的问题了。您的问题是两个子组合框共享相同的模型,因此如果您更改一个子组合框中的选择,它会更改共享模型的状态,导致另一个子组合框更改其选择。解决你的问题,给他们每个人自己的模型。

即,

switch (Issue) {
    case "Angle":
        {
            DefaultComboBoxModel newModel1 = new DefaultComboBoxModel(Angle);
            DefaultComboBoxModel newModel2 = new DefaultComboBoxModel(Angle);
            Combo1.setModel(newModel1);
            Combo2.setModel(newModel2);
            break;
        }
    // etc... 

此外,请考虑使用 map ,例如 HashMap<String, String[]>HashMap<String, Vector<String>> 。这样做并正确填充 Map,那么巨大的 switch 语句可以简化为

Combo1.setModel(new DefaultComboBoxModel(modelMap.get(Issue)));
Combo2.setModel(new DefaultComboBoxModel(modelMap.get(Issue)));

接下来我们将研究 Java 命名规则。

关于java - JComboBox 和 Action、新模型等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12993815/

相关文章:

java - 正则表达式无法使特殊结构 (?=x) 起作用

java - 如何围绕框布局制作 JScrollpane

javascript - jquery fancybox 触发点击只工作一次

java - 按下按钮后每 3 秒更新一次 JTextFields 文本

jquery - 如何在不导入整个移动驱动 JavaScript 框架的情况下使用触摸事件?

ruby-on-rails - 基于当前事件触发 future 事件

java - 如何使用 SSHJ 从 SFTP 服务器获取预过滤的文件列表

java - 以恒定单位添加日期之间的差异

Java帮助将UDP数据包转换为int

java - 摄氏度始终为 0.0?