代码之家  ›  专栏  ›  技术社区  ›  Cratylus

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

  •  2
  • Cratylus  · 技术社区  · 14 年前

    这肯定是我的误解,但我有以下几点:
    我向Jcombobox添加了一个ItemListener。

    如果是,我将更新JTextPane中的值。 问题是它的工作原理如下:
    我单击jcombobox中的一个新值,jtextfield中没有任何更改。我必须实际单击另一个组件,例如jtextfield,然后更新jtextfield。
    似乎必须从jcombobox中移除焦点,以便将事件更改发送到itemlistener代码。

    更新: 我的代码和方法updateJTextPane被调用 当我从组合框中选择一个新值时。一、 e.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: 谢谢你

    4 回复  |  直到 14 年前
        1
  •  1
  •   Grodriguez    14 年前

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

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

    你的 itemStateChanged 方法看起来不错,问题一定在别处。也许是有问题 updateJTextPane . 如果你把电话换成 更新文本窗格 用一个 System.out.println ? 另外,你能打印出事件的来源吗( ie.getSource() )并确认事件实际上来自第一个组合框?

    如果您发布了一个可以编译和运行的自包含示例,那么应该更容易查明问题所在。

        2
  •  1
  •   deorst    14 年前

    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
  •   trashgod    14 年前

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

    假设我对你方要求的理解是正确的,这里有一个它如何工作的示例:

    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检查,则将对未选中的第一个项和选中的第二个项执行操作。

        4
  •  1
  •   Lisa Wang    12 年前

    对我来说,它更像是Java中的一个bug。我的情况是我有两个选择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具有与上一个选择相同的索引。