Java JComboBox操作侦听器

Java JComboBox操作侦听器,java,swing,jcombobox,actionlistener,Java,Swing,Jcombobox,Actionlistener,我有这个问题。 我有多个JComboBox(总共5个) 我在每个组合框中添加了一个ActionListener,但所有组合框的ActionListener都是相同的,称为: ComboBoxActionPerformed(java.awt.event.ActionEvent e) 当执行该操作时,我查看事件(e)并执行以下操作: 但问题是,当我在任何组合框中更改某些内容时,操作总是由我附加actionlistner的最后一个组合框触发 有人知道吗 然后我切换到ItemListner。 这就是我

我有这个问题。 我有多个JComboBox(总共5个)

我在每个组合框中添加了一个ActionListener,但所有组合框的ActionListener都是相同的,称为:

ComboBoxActionPerformed(java.awt.event.ActionEvent e)
当执行该操作时,我查看事件(e)并执行以下操作:

但问题是,当我在任何组合框中更改某些内容时,操作总是由我附加actionlistner的最后一个组合框触发

有人知道吗

然后我切换到ItemListner。 这就是我正在做的

class MyActionListner implements ItemListener 
{
    //STUFF
        @Override
        public void itemStateChanged(ItemEvent evt) 
        {
            //DO STUFF
    }
}

public JComboBox createCombo()
{
    JComboBox box = new JComboBox();
        box.setModel(new javax.swing.DefaultComboBoxModel(new String[] 
                { "val1", "val2","val3" }));
        RulesActionListner actionL = new RulesActionListner();
        box.addItemListener(actionL);
return box;
}
createCombo被多次调用 但不管在我的ItemStateChanged方法中更改了哪个组合框项 从上次创建的组合框提交


createCombo是在运行时调用的,因此我有一个数量可变的组合框。

添加单独的操作侦听器,而不是让一个操作侦听器为每个调用运行if语句。代码的这一部分的逻辑很可能存在导致选择最后一个组合框的错误。(可能是
else
语句,如果
,则应该是
else,等等)


从长远来看,将其分离出来将更加面向对象,并且将更加灵活。

添加单独的操作侦听器,而不是让一个操作侦听器为每个调用运行if语句。代码的这一部分的逻辑很可能存在导致选择最后一个组合框的错误。(可能是
else
语句,如果
,则应该是
else,等等)


从长远来看,将其分离出来将更加面向对象,并且将更加灵活。

您是否尝试使用ItemListener来代替

表示每次编辑组合框时都会触发ActionEvent

问候,,
Stéphane

您是否尝试改用ItemListener

表示每次编辑组合框时都会触发ActionEvent

问候,,
你的问题我不清楚,你的意思是——走这条路,还是我错了

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class ComboBoxTwo extends JFrame implements ActionListener, ItemListener {

    private static final long serialVersionUID = 1L;
    private JComboBox mainComboBox;
    private JComboBox subComboBox;
    private Hashtable<Object, Object> subItems = new Hashtable<Object, Object>();

    public ComboBoxTwo() {
        String[] items = {"Select Item", "Color", "Shape", "Fruit", "Size"};
        mainComboBox = new JComboBox(items);
        mainComboBox.addActionListener(this);
        mainComboBox.addItemListener(this);
        //prevent action events from being fired when the up/down arrow keys are used
        //mainComboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
        getContentPane().add(mainComboBox, BorderLayout.WEST);
        subComboBox = new JComboBox();//  Create sub combo box with multiple models
        subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4
        subComboBox.addItemListener(this);
        getContentPane().add(subComboBox, BorderLayout.CENTER);
        String[] subItems1 = {"Select Color", "Red", "Blue", "Green"};
        subItems.put(items[1], subItems1);
        String[] subItems2 = {"Select Shape", "Circle", "Square", "Triangle"};
        subItems.put(items[2], subItems2);
        String[] subItems3 = {"Select Fruit", "Apple", "Orange", "Banana"};
        subItems.put(items[3], subItems3);
        String[] subItems4 = {"Select Size", "Big", "Middle", "Small"};
        subItems.put(items[4], subItems4);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String item = (String) mainComboBox.getSelectedItem();
        Object o = subItems.get(item);
        if (o == null) {
            subComboBox.setModel(new DefaultComboBoxModel());
        } else {
            subComboBox.setModel(new DefaultComboBoxModel((String[]) o));
        }
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {
            if (e.getSource() == mainComboBox) {
                if (mainComboBox.getSelectedIndex() != 0) {
                    FirstDialog firstDialog = new FirstDialog(ComboBoxTwo.this,
                            mainComboBox.getSelectedItem().toString(), "Please wait,  Searching for ..... ");
                }
            } 
        }
    }

    private class FirstDialog extends JDialog {

        private static final long serialVersionUID = 1L;

        FirstDialog(final Frame parent, String winTitle, String msgString) {
            super(parent, winTitle);
            setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
            JLabel myLabel = new JLabel(msgString);
            JButton bNext = new JButton("Stop Processes");
            add(myLabel, BorderLayout.CENTER);
            add(bNext, BorderLayout.SOUTH);
            bNext.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    setVisible(false);
                }
            });
            javax.swing.Timer t = new javax.swing.Timer(1000, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    setVisible(false);
                }
            });
            t.setRepeats(false);
            t.start();
            setLocationRelativeTo(parent);
            setSize(new Dimension(400, 100));
            setVisible(true);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new ComboBoxTwo();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
公共类ComboBoxTwo扩展JFrame实现ActionListener、ItemListener{
私有静态最终长serialVersionUID=1L;
专用JComboBox主组合框;
专用JComboBox子omboBox;
私有哈希表子项=新哈希表();
公营机构{
字符串[]项={“选择项”、“颜色”、“形状”、“水果”、“大小”};
mainComboBox=新的JComboBox(项目);
mainComboBox.addActionListener(这个);
mainComboBox.addItemListener(此);
//使用向上/向下箭头键时防止触发操作事件
//mainComboBox.putClientProperty(“JComboBox.isTableCellEditor”,Boolean.TRUE);
getContentPane().add(mainComboBox,BorderLayout.WEST);
subComboBox=new JComboBox();//创建具有多个模型的子组合框
subComboBox.setPrototypeDisplayValue(“xxxxxxxxx”);//JDK1.4
subComboBox.addItemListener(此);
getContentPane().add(subComboBox,BorderLayout.CENTER);
字符串[]子项1={“选择颜色”、“红色”、“蓝色”、“绿色”};
子项目。投入(项目[1],子项目1);
字符串[]子项2={“选择形状”、“圆”、“正方形”、“三角形”};
子项目。投入(项目[2],子项目2);
String[]subItems3={“选择水果”、“苹果”、“橘子”、“香蕉”};
子项目。投入(项目[3],子项目3);
字符串[]子项4={“选择大小”、“大”、“中”、“小”};
子项目。投入(项目[4],子项目4);
}
@凌驾
已执行的公共无效操作(操作事件e){
String item=(String)mainComboBox.getSelectedItem();
对象o=子项。获取(项);
如果(o==null){
setModel(新的DefaultComboxModel());
}否则{
setModel(新的DefaultComboxModel((字符串[])o));
}
}
@凌驾
公共无效itemStateChanged(ItemEvent e){
如果(如getStateChange()==ItemEvent.SELECTED){
如果(例如getSource()==mainComboBox){
如果(mainComboBox.getSelectedIndex()!=0){
FirstDialog FirstDialog=新建FirstDialog(ComboBoxTwo.this,
mainComboBox.getSelectedItem().toString(),“请稍候,正在搜索…”;
}
} 
}
}
私有类FirstDialog扩展JDialog{
私有静态最终长serialVersionUID=1L;
第一个对话框(最终帧父级、字符串winTitle、字符串msgString){
超级(家长,winTitle);
setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
JLabel myLabel=新的JLabel(msgString);
JButton bNext=新JButton(“停止进程”);
添加(myLabel,BorderLayout.CENTER);
添加(bNext,BorderLayout.SOUTH);
bNext.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件evt){
setVisible(假);
}
});
javax.swing.Timer t=newjavax.swing.Timer(1000,newActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
setVisible(假);
}
});
t、 设置重复(假);
t、 start();
setLocationRelativeTo(父级);
设置尺寸(新尺寸(400100));
setVisible(真);
}
}
公共静态void main(字符串[]args){
JFrame frame=new ComboBoxTwo();
frame.setDefaultCloseOperation(关闭时退出);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
}

@user650608您的问题我不清楚,您的意思是-走这边,还是我错了

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class ComboBoxTwo extends JFrame implements ActionListener, ItemListener {

    private static final long serialVersionUID = 1L;
    private JComboBox mainComboBox;
    private JComboBox subComboBox;
    private Hashtable<Object, Object> subItems = new Hashtable<Object, Object>();

    public ComboBoxTwo() {
        String[] items = {"Select Item", "Color", "Shape", "Fruit", "Size"};
        mainComboBox = new JComboBox(items);
        mainComboBox.addActionListener(this);
        mainComboBox.addItemListener(this);
        //prevent action events from being fired when the up/down arrow keys are used
        //mainComboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
        getContentPane().add(mainComboBox, BorderLayout.WEST);
        subComboBox = new JComboBox();//  Create sub combo box with multiple models
        subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4
        subComboBox.addItemListener(this);
        getContentPane().add(subComboBox, BorderLayout.CENTER);
        String[] subItems1 = {"Select Color", "Red", "Blue", "Green"};
        subItems.put(items[1], subItems1);
        String[] subItems2 = {"Select Shape", "Circle", "Square", "Triangle"};
        subItems.put(items[2], subItems2);
        String[] subItems3 = {"Select Fruit", "Apple", "Orange", "Banana"};
        subItems.put(items[3], subItems3);
        String[] subItems4 = {"Select Size", "Big", "Middle", "Small"};
        subItems.put(items[4], subItems4);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String item = (String) mainComboBox.getSelectedItem();
        Object o = subItems.get(item);
        if (o == null) {
            subComboBox.setModel(new DefaultComboBoxModel());
        } else {
            subComboBox.setModel(new DefaultComboBoxModel((String[]) o));
        }
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {
            if (e.getSource() == mainComboBox) {
                if (mainComboBox.getSelectedIndex() != 0) {
                    FirstDialog firstDialog = new FirstDialog(ComboBoxTwo.this,
                            mainComboBox.getSelectedItem().toString(), "Please wait,  Searching for ..... ");
                }
            } 
        }
    }

    private class FirstDialog extends JDialog {

        private static final long serialVersionUID = 1L;

        FirstDialog(final Frame parent, String winTitle, String msgString) {
            super(parent, winTitle);
            setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
            JLabel myLabel = new JLabel(msgString);
            JButton bNext = new JButton("Stop Processes");
            add(myLabel, BorderLayout.CENTER);
            add(bNext, BorderLayout.SOUTH);
            bNext.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    setVisible(false);
                }
            });
            javax.swing.Timer t = new javax.swing.Timer(1000, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    setVisible(false);
                }
            });
            t.setRepeats(false);
            t.start();
            setLocationRelativeTo(parent);
            setSize(new Dimension(400, 100));
            setVisible(true);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new ComboBoxTwo();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
公共类Combo