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:谢谢你的帮助。测试也失败了,但当我重新启动电脑时,我的代码和你的测试都没有问题。不确定如何重新启动它卡住了。我将结束这个问题