62

ActionListener と ItemListener の両方を使用して、JCheckBox でイベントを発生させますか?

では、それらの違いは何ですか。どちらの場合、どちらが優先されますか?

4

5 に答える 5

66

ItemListener同様に、同じ動作をActionListenerする場合。JCheckBoxただし、チェックボックスをオンにすると、大きな違いがItemListener発生する可能性がsetSelected(true)あります。コーディングの慣例として、矛盾を避けるために、とItemListener同様に両方を登録しないでください。ActionListenerJCheckBox

于 2012-03-27T03:56:05.183 に答える
28

違いは、マウスでクリックするか、スペースバーまたはニーモニックでクリックすることによって状態が変更されるActionEventアクションが実行されたときに発生することです。が選択されているか選択解除されているかに関係なく、実際には変更イベントをリッスンJCheckBoxしませんJCheckBox

たとえば、 if JCheckBox c1(say) が a に追加されButtonGroupます。JCheckBoxesで otherの状態を変更してもButtonGroupActionEventon otherJCheckBoxではなく、ItemEventが起動されます。

最後の言葉:ItemEventは、ユーザーが別のチェック ボックスを選択してチェック ボックスをオフにした場合でも発生しますがJCheckBox( の場合ButtonGroup)、ActionEventそのようには生成されず、 (のみが登録されている)ActionEventでアクションが実行されたかどうかをリッスンするだけです。他のすべての選択/選択解除のものについては知りません。JCheckBoxActionListenerButtonGroup

于 2013-07-10T16:42:28.883 に答える
22

参考までに、違いを示す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();
            }
        });
    }
}
于 2012-03-27T04:52:13.540 に答える
4

addActionListenerは JButtons に使用しますが、 にaddItemListenerはより便利ですJToggleButton。と一緒if(event.getStateChange()==ItemEvent.SELECTED)に、後者の場合、JToggleButton がチェック/チェック解除されるたびにイベントを追加します。

于 2013-10-22T20:19:19.270 に答える