我有一个在运行时填充的JCombobox,并根据表单上的其他操作重新填充。问题是我只希望用户鼠标/键盘点击触发actionListener。不幸的是,actionListener是由组合框的程序清除/加载触发的。
我试图绕过这个问题的方法是检查控件是否具有焦点,这是用户可以直接操作它的唯一方式,而当其他控件清除/加载它的内容时将永远不会出现这种情况。不幸的是,hasFocus()
部分总是返回null。
以下是我的表单的精简示例,仅包含问题:
package newProj;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JTabbedPane;
public class hasFocusTest {
private JFrame frame;
public static String DBurl;
private JComboBox<?> cmbEquipSpec;
public static void main(String[] args) {
hasFocusTest window = new hasFocusTest();
window.frame.setVisible(true);
}
public hasFocusTest() {
initialize();
}
public static void populateSpec(DefaultComboBoxModel<String> Speclist) {
Speclist.removeAllElements();
Speclist.addElement("1");
Speclist.addElement("2");
Speclist.addElement("3");
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 280, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
this.frame.setFocusable(false);
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
tabbedPane.setBounds(10, 11, 240, 140);
frame.getContentPane().add(tabbedPane);
JLayeredPane p_1 = new JLayeredPane();
tabbedPane.addTab("Define Function", null, p_1, null);
DefaultComboBoxModel<String> Speclist = new DefaultComboBoxModel<String>();
populateSpec(Speclist);
cmbEquipSpec = new JComboBox<String>(Speclist);
cmbEquipSpec.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
boolean sFocus = false;
try {
sFocus = cmbEquipSpec.hasFocus();
} catch (NullPointerException e) {
}
System.out.println(sFocus);
System.out.println("cmbEquipSpec: " + cmbEquipSpec);
}
});
cmbEquipSpec.setEditable(true);
cmbEquipSpec.setBounds(10, 31, 64, 20);
p_1.add(cmbEquipSpec);
JLabel lblEquipSpec = new JLabel("Equip Spec");
lblEquipSpec.setBounds(15, 11, 74, 14);
p_1.add(lblEquipSpec);
p_1.setVisible(true);
}
}
如果我将中间部分改为:
Component sFocus = null;
try {
sFocus = frame.getFocusOwner();
} catch (NullPointerException e) {
}
然后它告诉我有焦点的组件明显不同于被点击的组件。
点击了组件:
javax.swing.JComboBox[,10,31,64x20,invalid,layout=javax.swing.plaf.metal.MetalComboBoxUI$MetalComboBoxLayoutManager,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,isEditable=true,lightWeightPopupEnabled=true,maximumRowCount=8,selectedItemReminder=3]
有焦点的组件:
javax.swing.plaf.metal.MetalComboBoxEditor$1[,0,0,44x20,invalid,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalComboBoxEditor$EditorBorder@1d04923d,flags=8388904,maximumSize=,minimumSize=,preferredSize=,caretColor=sun.swing.PrintColorUIResource[r=51,g=51,b=51],disabledTextColor=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],editable=true,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],selectedTextColor=sun.swing.PrintColorUIResource[r=51,g=51,b=51],selectionColor=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],columns=9,columnWidth=0,command=,horizontalAlignment=LEADING]
我对此很陌生,对我来说没理由为什么我点击的组合框不是那个有焦点的组合框。但是,为了重新迭代,这是我尝试解决方案。如果有一种方法可以从actionListener中排除编程操作,那么这也可以实现我的目标。我相信。
答案 0 :(得分:1)
不幸的是,actionListener是由组合框的编程清除/加载触发的。