Java itemlistener从jcombobox中移除焦点后获取事件

Java itemlistener从jcombobox中移除焦点后获取事件,java,events,swing,jcombobox,Java,Events,Swing,Jcombobox,这一定是我的误解,但我有以下几点: 我已将ItemListener添加到Jcombobox。 在项目侦听器中,我检查事件是否为ItemSelected类型。 如果是,则更新JTextPane中的值。 问题是它的工作原理如下: 我在jcombobox中单击一个新值,jtextfield中没有任何更改。我必须实际单击另一个组件,例如jtextfield,然后更新jtextfield。 似乎必须从jcombobox中删除焦点,以便将事件更改发送到itemlistener代码。 是这样的,还是我做错了什

这一定是我的误解,但我有以下几点:
我已将ItemListener添加到Jcombobox。
在项目侦听器中,我检查事件是否为ItemSelected类型。
如果是,则更新JTextPane中的值。 问题是它的工作原理如下:
我在jcombobox中单击一个新值,jtextfield中没有任何更改。我必须实际单击另一个组件,例如jtextfield,然后更新jtextfield。
似乎必须从jcombobox中删除焦点,以便将事件更改发送到itemlistener代码。
是这样的,还是我做错了什么?是否可以在不移除焦点的情况下处理事件

更新:这是我的代码和方法updateJTextPane,在我单击另一个组件后调用,在我从组合中选择新值时调用。例如,combo的值为“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个组合框中,如果这在某种程度上我不知道
谢谢

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

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

更新:

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

如果您发布了一个可以编译和运行的自包含示例,那么确定问题应该会容易得多

是否可以在不移除焦点的情况下处理事件? 当然是!:)

假设我对您的需求的理解是正确的,下面是它如何工作的示例:

class ComboListener implements ItemListener {
    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {
            System.out.println("Selected Item: \""
                + ((JComboBox)e.getSource()).getSelectedItem() + "\"");
        }
    } 
}

如果不添加“如果”检查,则将对第一个未选中的项目和第二个选中的项目执行操作。

它应该按照您的描述工作,以下操作运行正常:

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();
            }
        });

    }
}

我在选择时也遇到过类似的情况。
对我来说,它更像是Java中的一个bug。我的情况是我有两个选择A和B。B取决于A的选择。例如,A={a1,a2,a3}。如果A=a1b是{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具有与上一选择相同的索引

@Godriguez:区别在于我在itemlistener中检查:if(即getStateChange()==ItemEvent.SELECTED){//调用我的函数}。你是说我应该取消这张支票?但是,我怎么知道所选项目已更改?不,我说的是,您应该先尝试一个简单的示例,然后逐步添加功能,看看问题出在哪里。我链接的示例是否适用于您?@user384706,此过程称为创建SSCCE()。每个问题都应该包含一个SSCCE。根据你发布的4行代码,任何人都无法判断你做错了什么。我不确定我是否遵守了。我在itemStateChanged方法中有if条件,只有在焦点从jcombobox中移除后,我才能获得事件。@Cratylus侦听器将被调用一次,用于选择您单击的项,一次用于取消选择以前选择的项。如果检查有助于仅访问所选项目的事件,而不是取消选择的事件。@trashgood谢谢!:)这是我关于堆栈溢出的第一篇帖子,因此我有了一个相当新的想法:)@fcocq:奇怪。这可能与netbeans有关吗?我使用IDE作为我的编码工具,不确定netbeans是如何生成GUI代码的。如果ItemListener是由封闭类实现的,例如“class Frame extends JFrame implements ItemListener”并添加到其他组件中,那么您还需要检查正在处理的组件,例如如果((即getSource()==yourComboBox)&&(即getStateChange()==ItemEvent.SELECTED)){…@fbcocq:item listener被添加到另外5个组合框中。这有什么关系吗?重新格式化的代码;如果不正确,请还原。@user384706:你能试试我在回答中提到的两个测试吗?@Grodriguez:谢谢你的帮助。测试也失败了,但当我重新启动电脑时,我的代码和你的测试都没有问题。不确定如何重新启动它卡住了。我将结束这个问题