web-dev-qa-db-ja.com

JCheckbox-ActionListenerとItemListener?

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

それで、それらの違いは何ですか?その場合、それらのうちの1つが他よりも優先されますか?

57
TU_HEO DAKAI

ItemListenerの場合、ActionListenerJCheckBoxの両方が同じ動作をします。ただし、大きな違いは、ItemListenerは、チェックボックスでsetSelected(true)を呼び出すことでトリガーできることです。コーディングの慣行として、ItemListenerActionListenerの両方をJCheckBoxに登録しないでください。矛盾を避けるためです。

54
NiranjanBhat

違いは、ActionEventでアクションが実行されたときにJCheckBoxが起動されることです。つまり、マウスまたはスペースバーまたはニーモニックでクリックすると状態が変更されます。 JCheckBoxが選択されているか選択解除されているかにかかわらず、変更イベントをリッスンしません

たとえば、JCheckBox c1(say)はButtonGroupに追加されます。 JCheckBoxes内の他のButtonGroupの状態を変更しても、他のActionEvent上のJCheckBoxは起動されず、代わりにItemEventが起動されます。

最後の言葉:ユーザーが別のItemEventを選択してチェックボックスの選択を解除しても、JCheckBoxが起動されます( ButtonGroup)、ただしActionEventはそのように生成されず、代わりにActionEventJCheckBoxActionListenerは登録済みのみ)またはそうではありません。 ButtonGroupおよびその他すべての選択/選択解除については知りません。

24
JavaTechnical

参考のため、違いを示す sscce を示します。コンソール:

 SELECTED 
 ACTION_PERFORMED 
 DESELECTED 
 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();
            }
        });
    }
}
20
trashgod

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

3
mario go

私はこれを自分でテストし、この投稿のすべての答えを見てきましたが、彼らがこの質問によく答えているとは思いません。良い答えを得るために自分で実験しました(以下のコード)。ラジオボタンまたはチェックボックス、またはObject型であると想定している他の種類のSwingアイテムで状態が変更されると、ActionListenerとItemListenerの両方でイベントを100%発生させることができます。これら2つのリスナー間でわかる唯一の違いは、リスナーで返されるイベントオブジェクトのタイプが異なることです。そして、ActionListenerではなくItemListenerを使用するチェックボックスで、より良いイベントタイプを取得します。

ActionEventとItemEventの戻り値の型には、イベントの型が発生したときに使用できる異なるメソッドが格納されます。以下のコードでは、コメントはクラスが返すイベントタイプごとの.getメソッドの違いを示しています。

以下のコードは、JRadioButtons、JCheckBoxes、およびボタン設定に基づいて変化するJLabelディスプレイを備えたシンプルなJPanelを設定します。すべてのRadioButtonとCheckBoxを、アクションリスナーとアイテムリスナーの両方で設定しました。次に、この実験で最初にテストしたため、ActionListenerで完全にコメントを付けて以下のListenerクラスを作成しました。このパネルをフレームに追加して表示すると、リスナーのタイプに関係なく、すべてのラジオボタンとチェックボックスが常に起動し、一方のメソッドをコメントアウトし、もう一方のメソッドを試すだけです。

実装されたメソッドへの戻り型は、2つの間の主な違いです。両方のリスナーは同じ方法でイベントを発生させます。上記のコメントでもう少し良く説明されているのは、返されるイベントの種類のために、チェックボックスがActionListenerよりItemListenerを使用する必要がある理由です。

package EventHandledClasses;
import javax.swing.*;
import Java.awt.*;
import Java.awt.event.*;

public class RadioButtonsAndCheckBoxesTest extends JPanel{
JLabel display;
String funny, serious, political;
JCheckBox bold,italic;
JRadioButton funnyQuote, seriousQuote, politicalQuote;
ButtonGroup quotes;

    public RadioButtonsAndCheckBoxesTest(){
        funny = "You are not ugly, you were just born... different";
        serious = "Recommend powdered soap in prison!";
        political = "Trump can eat a little Bernie, but will choke on his     Birdie";

        display = new JLabel(funny);
        Font defaultFont = new Font("Ariel",Font.PLAIN,20);
        display.setFont(defaultFont);

        bold = new JCheckBox("Bold",false);
        bold.setOpaque(false);
        italic = new JCheckBox("Italic",false);
        italic.setOpaque(false);

        //Color itemBackground =

        funnyQuote = new JRadioButton("Funny",true);
        funnyQuote.setOpaque(false);
        seriousQuote = new JRadioButton("Serious");
        seriousQuote.setOpaque(false);
        politicalQuote = new JRadioButton("Political");
        politicalQuote.setOpaque(false);

        quotes = new ButtonGroup();
        quotes.add(funnyQuote);
        quotes.add(seriousQuote);
        quotes.add(politicalQuote);

        JPanel primary = new JPanel();
        primary.setPreferredSize(new Dimension(550, 100));

        Dimension standard = new Dimension(500, 30);

        JPanel radioButtonsPanel = new JPanel();
        radioButtonsPanel.setPreferredSize(standard);
        radioButtonsPanel.setBackground(Color.green);
        radioButtonsPanel.add(funnyQuote);
        radioButtonsPanel.add(seriousQuote);
        radioButtonsPanel.add(politicalQuote);

        JPanel checkBoxPanel = new JPanel();
        checkBoxPanel.setPreferredSize(standard);
        checkBoxPanel.setBackground(Color.green);
        checkBoxPanel.add(bold);
        checkBoxPanel.add(italic);

        primary.add(display);
        primary.add(radioButtonsPanel);
        primary.add(checkBoxPanel);

        //Add Action Listener To test Radio Buttons
        funnyQuote.addActionListener(new ActionListen());
        seriousQuote.addActionListener(new ActionListen());
        politicalQuote.addActionListener(new ActionListen());

        //Add Item Listener to test Radio Buttons
        funnyQuote.addItemListener(new ItemListen());
        seriousQuote.addItemListener(new ItemListen());
        politicalQuote.addItemListener(new ItemListen());

        //Add Action Listener to test Check Boxes
        bold.addActionListener(new ActionListen());
        italic.addActionListener(new ActionListen());

        //Add Item Listener to test Check Boxes
        bold.addItemListener(new ItemListen());
        italic.addItemListener(new ItemListen());

        //adds primary JPanel to this JPanel Object
        add(primary);   
    }

    private class ActionListen implements ActionListener{

        public void actionPerformed(ActionEvent e) {

         /*
         Different Get Methods from  ItemEvent 
         e.getWhen()
         e.getModifiers()
         e.getActionCommand()*/

            /*int font=Font.PLAIN;
            if(bold.isSelected()){
                font += Font.BOLD;
            }
            if(italic.isSelected()){
                font += Font.ITALIC;
            }
            display.setFont(new Font("Ariel",font,20));

            if(funnyQuote.isSelected()){
                display.setText(funny);
            }
            if(seriousQuote.isSelected()){
                display.setText(serious);
            }
            if(politicalQuote.isSelected()){
                display.setText(political);
            }*/
        }
    }
    private class ItemListen implements ItemListener {

        public void itemStateChanged(ItemEvent arg0) {

            /*
            Different Get Methods from ActionEvent
            arg0.getItemSelectable()
            arg0.getStateChange()
            arg0.getItem()*/


            int font=Font.PLAIN;
            if(bold.isSelected()){
                font += Font.BOLD;
            }
            if(italic.isSelected()){
                font += Font.ITALIC;
            }
            display.setFont(new Font("Ariel",font,20));

            if(funnyQuote.isSelected()){
                display.setText(funny);
            }
            if(seriousQuote.isSelected()){
                display.setText(serious);
            }
            if(politicalQuote.isSelected()){
                display.setText(political);
            }

        }

    }
}
1
maximusg