2 回答

TA貢獻1934條經(jīng)驗 獲得超2個贊
最好的想法是用布爾標志標記您自己的事件,正如@LucA 所提議的那樣。但如果由于某些原因你不能這樣做,你可以嘗試檢查事件的發(fā)起者。如果發(fā)起者是您的組合框 - 事件由用戶觸發(fā)。這是一個例子:
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并在您的程序中使用它。

TA貢獻1995條經(jīng)驗 獲得超2個贊
這可能有效:
聲明一個布爾值,意思是“組合框正在被程序更改,而不是用戶”
每次您的代碼更改所選值時都將其設置為 true,之后再次設置為 false。
在您的 actionPerformed 事件中,如果您的布爾值為真,則不執(zhí)行任何操作。如果為假,則意味著用戶正在更改它。
添加回答
舉報