ActionListener と ItemListener の両方を使用して、JCheckBox でイベントを発生させますか?
では、それらの違いは何ですか。どちらの場合、どちらが優先されますか?
ActionListener と ItemListener の両方を使用して、JCheckBox でイベントを発生させますか?
では、それらの違いは何ですか。どちらの場合、どちらが優先されますか?
とItemListener
同様に、同じ動作をActionListener
する場合。JCheckBox
ただし、チェックボックスをオンにすると、大きな違いがItemListener
発生する可能性がsetSelected(true)
あります。コーディングの慣例として、矛盾を避けるために、とItemListener
同様に両方を登録しないでください。ActionListener
JCheckBox
違いは、マウスでクリックするか、スペースバーまたはニーモニックでクリックすることによって状態が変更されるActionEvent
アクションが実行されたときに発生することです。が選択されているか選択解除されているかに関係なく、実際には変更イベントをリッスンJCheckBox
しません。JCheckBox
たとえば、 if JCheckBox c1
(say) が a に追加されButtonGroup
ます。JCheckBoxes
で otherの状態を変更してもButtonGroup
、ActionEvent
on otherJCheckBox
ではなく、ItemEvent
が起動されます。
最後の言葉:ItemEvent
は、ユーザーが別のチェック ボックスを選択してチェック ボックスをオフにした場合でも発生しますがJCheckBox
( の場合ButtonGroup
)、ActionEvent
そのようには生成されず、 (のみが登録されている)ActionEvent
でアクションが実行されたかどうかをリッスンするだけです。他のすべての選択/選択解除のものについては知りません。JCheckBox
ActionListener
ButtonGroup
参考までに、違いを示すsscceを次に示します。コンソール:
選択済み ACTION_PERFORMED 選択解除 ACTION_PERFORMED
コード:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** @see http://stackoverflow.com/q/9882845/230513 */
public class Listeners {
private void display() {
JFrame f = new JFrame("Listeners");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JCheckBox b = new JCheckBox("JCheckBox");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getID() == ActionEvent.ACTION_PERFORMED
? "ACTION_PERFORMED" : e.getID());
}
});
b.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println(e.getStateChange() == ItemEvent.SELECTED
? "SELECTED" : "DESELECTED");
}
});
JPanel p = new JPanel();
p.add(b);
f.add(p);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Listeners().display();
}
});
}
}
私addActionListener
は JButtons に使用しますが、 にaddItemListener
はより便利ですJToggleButton
。と一緒if(event.getStateChange()==ItemEvent.SELECTED)
に、後者の場合、JToggleButton がチェック/チェック解除されるたびにイベントを追加します。