2010-11-07 28 views
2

这一定是我的一个误解,但我有以下内容:
我已将一个ItemListener添加到Jcombobox中。
在项目监听器中,如果它是ItemSelected类型的事件,我将检查它。
如果是,我更新JTextPane中的值。 问题是,它的工作原理如下:
我点击jcombobox中的新值,jtextfield中没有任何更改。我必须实际点击另一个组件,例如jtextfield然后jtextfield被更新。
似乎必须从jcombobox中删除焦点,以便将事件更改分派给itemlistener代码。
这是应该如何工作,或者我做错了什么?是否有可能处理该事件而无需消除焦点?itemlistener从jcombobox中删除焦点后得到事件

UPDATE:这是我的代码和方法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加到5个组合框在相同的JDialog如果这个问题的方式,我不知道 谢谢

+0

重新格式化的代码;如果不正确请回复。 – trashgod 2010-11-07 18:12:05

+0

@ user384706:你可以尝试我在我的回答中提到的两个测试吗? – Grodriguez 2010-11-07 22:25:51

+0

@Grodriguez:谢谢你的帮助。测试也失败了,但是当我重新启动我的电脑时,没有问题,用我的代码和测试。不知道它如何卡住。我会关闭这个问题 – Cratylus 2010-11-08 21:07:17

回答

1

这不是它应该如何工作。项目事件应该在所选项目改变时立即生成。

我建议从一个简单的例子开始,如this one,看看事件是否真的在生成。如果这样做,那么你只需要搜索这个和你自己的代码之间的区别。

更新:

itemStateChanged方法看起来不错,这个问题必须在别处。也许updateJTextPane有什么问题。如果您将电话updateJTextPane替换为System.out.println,会发生什么情况?另外,您是否可以打印出事件源(ie.getSource())并确认该事件实际上是来自第一个组合框?

如果您发布一个可以编译并运行的独立示例,应该更容易查明问题。

+0

@戈德里格兹:不同的是,在我的itemlistener我检查:if(ie.getStateChange()== ItemEvent.SELECTED){//调用我的函数}。你是说我应该取消这张支票?但是,那么我怎么会知道所选的项目已更改? – Cratylus 2010-11-07 11:48:05

+1

不,我说的是你应该首先尝试一个简单的例子,然后逐步添加功能来查看问题的位置。我的例子是否将你的工作联系在一起? – Grodriguez 2010-11-07 13:11:11

+0

@ user384706,这个过程被称为创建一个SSCCE(http://sscce.org)。每个问题都应该包括一个SSCCE。根据你发布的4行代码,任何人都无法判断你做错了什么。 – camickr 2010-11-07 15:19:17

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

如果不检查是否添加,你要执行的操作因为第一个项目被选中而第二个项目被选中。

+0

我不知道我关注。我在itemStateChanged方法中拥有if条件,并且只有在从jcombobox中移除焦点后才能获取该事件。 – Cratylus 2010-11-07 12:03:03

+0

重新格式化的代码;如果不正确请回复。 – trashgod 2010-11-07 18:15:52

+0

@Cratylus聆听者将被调用一次用于选择您单击的项目和一次用于取消选择先前选择的项目。如果检查有助于达到所选项目的事件,而不是取消选择。 – javatarz 2012-09-09 15:45:12

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

    } 
} 
+0

@fcocq:奇怪。这可能是与netbeans有关吗?我使用IDE作为我的代码 – Cratylus 2010-11-07 12:19:54

+0

可能是,不确定Netbeans如何生成GUI代码。如果ItemListener由封闭类实现,例如“class Frame extends JFrame implements ItemListener”并添加到其他组件中,然后还需要检查您正在处理的组件,例如如果((ie.getSource()== yourComboBox)&&(ie.getStateChange()== ItemEvent.SELECTED)){... – deorst 2010-11-07 12:33:40

+0

@ fbcocq:将项目侦听器添加到5个组合框中。这事很重要吗? – Cratylus 2010-11-07 21:41:46

1

我曾经遇到过上选择了类似的情况。 对我而言,它更喜欢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具有与之前选择相同的索引。