这一定是我方的误解,但我有以下几点:
我已经将一个ItemListener添加到了Jcombobox中
在项目监听器中,我检查事件是否为ItemSelected类型
如果是,我更新JTextPane中的值。
问题是它的工作原理如下:
我点击了jcombobox中的一个新值,并且在jtextfield中没有任何改变。我必须实际点击其他组件,例如jtextfield然后更新jtextfield
似乎必须从jcombobox中删除焦点,以便将事件更改分派给itemlistener代码。
这是它应该如何工作,还是我做错了什么?是否可以在不需要移除焦点的情况下处理事件?
更新:我的代码和方法updateJTextPane在我点击另一个组件后被称为 ,而不是当我从组合中选择一个新值时。即组合的值为“1”,我单击下拉列表并单击“2”。当前所选项目现在为“2”。此时我的方法没有被调用。我点击第二个组合框,第二个组合有焦点,然后调用我的方法updateJTextPane()。为什么呢?
更新2:
//Code from Netbeans generator
JComboBox myCbx = new javax.swing.JComboBox();
myCbx.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
myCbx.setName("myCbx"); // NOI18N
//My ItemListener
class myItemListener implements ItemListener{
public void itemStateChanged(ItemEvent ie) {
if (ie.getStateChange() == ItemEvent.SELECTED) { // Item was just selected
updateJTextPane();
}
}
}
//add item listener to combo
myCbx.addItemListener(new myItemListener());
更新3:内部类myItemListener被添加到同一个JDialog中的另外5个组合框中,如果这对我不知道的方式很重要 谢谢
答案 0 :(得分:1)
这不是它应该如何工作。每当所选项目发生变化时,应立即生成项目事件。
我建议从一个简单的示例开始,例如this one,看看是否实际生成了事件。如果这样做,那么您只需要搜索它和您自己的代码之间的差异。
<强>更新强>
您的itemStateChanged
方法看起来很好,问题必须在其他地方。也许updateJTextPane
有问题。如果您使用updateJTextPane
替换System.out.println
来电,会发生什么?此外,您可以打印出事件的来源(ie.getSource()
)并验证事件是否实际来自第一个组合框?
如果您发布了一个可以编译和运行的自包含示例,则应该更容易查明问题。
答案 1 :(得分:1)
是否可以在不需要移除焦点的情况下处理事件? 当然是啦! :)
以下是一个如何运作的示例,假设我对您的要求的理解是正确的:
class ComboListener implements ItemListener {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
System.out.println("Selected Item: \""
+ ((JComboBox)e.getSource()).getSelectedItem() + "\"");
}
}
}
如果您不添加if检查,您将对未选择的第一个项目和选择的第二个项目执行操作。
答案 2 :(得分:1)
它应该像你描述的那样工作,以下运行正常:
class Frame extends JFrame {
JComboBox box;
JTextField field;
String[] entries = { "one", "two", "three" };
Frame() {
setLayout(new FlowLayout());
box = new JComboBox(entries);
box.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
field.setText((String) box.getSelectedItem());
}
}
});
add(box);
field = new JTextField();
field.setColumns(10);
add(field);
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
public class Test {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Frame frame = new Frame();
}
});
}
}
答案 3 :(得分:1)
我在Choice上遇到过类似的情况。 对我来说,它更喜欢Java中的错误。我的情况是我有两个选择A和B. B取决于A的选择。例如,A = {a1,a2,a3}。如果A = a1 B是{1,2,3}的选择列表。如果A = a2,则B是{4,5,6}的列表。如果A = a3,则B是{7,8,9}的列表。选择a1然后在B上选择2选择a2,选择a2,B在默认索引0(4)中,在B上选择5,不调用itemStateChanged()函数。看起来视图控件不会与数据集同步。之所以没有调用itemStateChanged(),是因为5具有与先前选择相同的索引。