我遇到了这个问题。我有多个JComboBox(共5个)。
我为每个comboBox添加了一个ActionListener,但所有comboBox都使用相同的ActionListener
ComboBoxActionPerformed(java.awt.event.ActionEvent e)
当执行该操作时,我查看事件(e)并执行:
JComboBox c = ((JComboBox)e.getSource());
//DO WORK relating to c as thats the combobox that triggered.
但问题是,当我更改任何组合框中的内容时,Action总是由我附加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 if
的else
语句,等等)
将其分离将更加面向对象,并且从长远来看将更加灵活。
@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);
}
}
您是否尝试使用ItemListener?
医生说,每次编辑组合框时都会触发ActionEvent。
谨致问候,Stéphane