2

这一定是我的误解,但我有以下几点:
我在 Jcombobox 中添加了一个 ItemListener。
在项目侦听器中,我检查事件是否属于 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个组合框,如果这在某种程度上很重要,我不知道谢谢

4

4 回答 4

1

这不是它应该如何工作的。每当所选项目发生变化时,应立即生成项目事件。

我建议从一个简单的例子开始,比如这个例子,看看是否真的生成了事件。如果这可行,那么您只需要搜索此代码与您自己的代码之间的差异即可。

更新:

您的itemStateChanged方法看起来不错,问题一定出在其他地方。也许有什么问题updateJTextPane。如果您将调用替换为updateJTextPanea会发生什么System.out.println?此外,您能否打印出事件的来源 ( ie.getSource()) 并验证该事件是否确实来自第一个组合框?

如果您发布一个可以编译和运行的独立示例,那么查明问题应该会容易得多。

于 2010-11-07T11:33:21.480 回答
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 检查,您将对未选中的第一个项目和选中的第二个项目执行该操作。

于 2010-11-07T11:51:43.403 回答
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();
            }
        });

    }
}
于 2010-11-07T12:12:00.447 回答
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 和 B 在默认索引 0 (4) 并在 B 上选择 5,不会调用 itemStateChanged() 函数。看起来视图控件与设置的数据不同步。之所以没有调用 itemStateChanged(),是因为 5 具有与先前选择相同的索引。

于 2012-10-02T15:33:06.347 回答