【问题标题】:JComboBox events - SwingJComboBox 事件 - Swing
【发布时间】:2019-05-16 10:15:05
【问题描述】:

如何确保 JCombobox 中的 Item 是从 User 而不是从其他方法更改的?

因为我也有更改项目的方法。但是当用户更改项目时,事件必须做一些事情。

【问题讨论】:

    标签: java swing events jcombobox


    【解决方案1】:

    最好的办法是用一个布尔标志来标记你自己的事件,正如@LucA 所建议的那样。但是如果由于某些原因你做不到,你可以尝试检查事件的发起者。如果发起者是您的组合框 - 事件是由用户触发的。这是一个例子:

    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.InputEvent;
    import java.util.Objects;
    
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.WindowConstants;
    import javax.swing.plaf.basic.ComboPopup;
    
    /**
     * <code>JComboText</code>.
     */
    public class JComboText {
    
        public static void main(String[] args) {
            String[] items = new String[] {"First", "Second", "Third", "Fourth"};
            JComboBox<String> combo = new JComboBox<>(items);
            combo.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    boolean byUser = isTriggeredByUser(combo);
                    System.out.println("Changed by: " + (byUser ? "user" : "program"));
                }
            });
            JButton button = new JButton("Clear selection");
            button.addActionListener(e -> combo.setSelectedItem(null));
            JFrame frm = new JFrame("Combo test");
            frm.setLayout(new FlowLayout());
            frm.add(combo);
            frm.add(button);
            frm.pack();
            frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frm.setLocationRelativeTo(null);
            frm.setVisible(true);
        }
    
        private static boolean isTriggeredByUser(JComboBox<?> combo) {
            // check whether the change was triggered by another component
            final ComboPopup popup = (ComboPopup) combo.getUI().getAccessibleChild(combo, 0);
            final JList<?> list = popup.getList();
            if (EventQueue.getCurrentEvent() instanceof InputEvent) {
                return Objects.equals(EventQueue.getCurrentEvent().getSource(), combo)
                        || Objects.equals(EventQueue.getCurrentEvent().getSource(), list);
            }
            return false;
        }
    }
    

    您可以复制方法isTriggeredByUser 并在您的程序中使用它。

    【讨论】:

    • 它有效,非常感谢您的帮助,非常感谢!
    • @Fadi 当我的建议解决了您的问题时,请将其标记为有帮助(单击我的答案左侧的灰色复选框)。在这种情况下,我们获得了一些声誉;)
    【解决方案2】:

    这可能有效:

    声明一个布尔值,表示“组合框是由程序而不是用户更改的”

    每次您的代码更改所选值时都将其设为 true,之后再次设为 false。

    在您的 actionPerformed 事件中,如果您的布尔值为真,则不执行任何操作。如果为 false,则表示用户正在更改它。

    【讨论】:

    • 非常感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2017-11-10
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多