我创建了一个带有微调器和复选框的工具栏。
锭床工作符合我的预期。当我更改值时,调用侦听器并且调整器值为CHANGED。
但是,对于复选框,当我移过它时,会触发监听器(与微调器不同)并且除非我删除JOptionPabe语句,否则ODDLY检查的值不会更改。我该怎么写CheckBox?
final JSpinner spin2 = new JSpinner();
spin2.setModel(new SpinnerNumberModel(10, 1, 3000, 1));
ChangeListener listener2 = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub
JOptionPane.showMessageDialog(null,"Spinner change");
//show();
}
};
spin2.addChangeListener(listener2);
toolBar.add(spin2);
final JCheckBox AlertAudible = new JCheckBox("Audible");
AlertAudible.setSelected(true);
AlertAudible.setText("Audible");
AlertAudible.setForeground(Color.WHITE);
ChangeListener listener4 = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub
JOptionPane.showMessageDialog(null,"Alert check");
//starterModule.sigmaAlertAudible = AlertAudible.isSelected();
//show();
}
};
好的我把它改成了ItemListener:
ItemListener listener4 = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
JOptionPane.showMessageDialog(null,"Alert check SELECTED :"+e.getStateChange());
}
if (e.getStateChange() == ItemEvent.DESELECTED){
JOptionPane.showMessageDialog(null,"Alert check DESELECTED :"+e.getStateChange());
}
}
}
奇怪的是每当我“检查”这个盒子时,我的JOptionPane就会被称为TWICE! SELECTED和DESELECTED。 SO值保持不变!
答案 0 :(得分:1)
您需要按照建议使用ItemListener
,并使用SwingUtilities.invokeLater()
下一个技巧,而JOptionPane
只会被调用一次:
ItemListener listener4 = new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (e.getStateChange() == ItemEvent.SELECTED) {
JOptionPane.showMessageDialog(null,"Alert check SELECTED :"+ e.getStateChange());
} else if (e.getStateChange() == ItemEvent.DESELECTED) {
JOptionPane.showMessageDialog(null,"Alert check DESELECTED :"+ e.getStateChange());
}
}
});
}
};
似乎是bug
答案 1 :(得分:0)
我认为你需要一个ItemListener,而不是一个ChangeListener。请参阅此处的示例:http://docs.oracle.com/javase/tutorial/uiswing/components/button.html
ItemListener listener4 = new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
JOptionPane.showMessageDialog(null,"Alert check :"+e.getStateChange());
}
}
};
AlertAudible.addItemListener(listener4);