Java JComboBox事件-Swing

Java JComboBox事件-Swing,java,swing,events,jcombobox,Java,Swing,Events,Jcombobox,如何确保在JCombobox中从用户而不是从其他方法更改项目 因为我有一个方法也可以更改项目。但是,当用户更改项目时,事件必须执行某些操作 这可能有效: 声明一个布尔值,表示“组合框是由程序而不是用户更改的” 每次代码更改所选值时将其设置为true,然后再次设置为false 在actionPerformed事件中,如果布尔值为true,则不执行任何操作。如果它为false,则表示用户正在更改它。最好的方法是使用布尔标志标记您自己的事件,正如@LucA所建议的那样。但是,如果由于某些原因您不能这样

如何确保在
JCombobox
中从用户而不是从其他方法更改项目

因为我有一个方法也可以更改项目。但是,当用户更改项目时,事件必须执行某些操作

这可能有效:

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

每次代码更改所选值时将其设置为true,然后再次设置为false


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

最好的方法是使用布尔标志标记您自己的事件,正如@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
并在程序中使用。

它可以工作,非常感谢您的帮助,非常感谢@当我的建议解决了您的问题时,请将其标记为有用(单击我答案左侧的灰色复选框)。在这种情况下,我们获得了一些声誉;)非常感谢你的回答!