ActionListenerとItemListenerの両方を使用して、JCheckBoxでイベントを発生させますか?
それで、それらの違いは何ですか?その場合、それらのうちの1つが他よりも優先されますか?
ItemListener
の場合、ActionListener
とJCheckBox
の両方が同じ動作をします。ただし、大きな違いは、ItemListener
は、チェックボックスでsetSelected(true)
を呼び出すことでトリガーできることです。コーディングの慣行として、ItemListener
とActionListener
の両方をJCheckBox
に登録しないでください。矛盾を避けるためです。
違いは、ActionEvent
でアクションが実行されたときにJCheckBox
が起動されることです。つまり、マウスまたはスペースバーまたはニーモニックでクリックすると状態が変更されます。 JCheckBox
が選択されているか選択解除されているかにかかわらず、変更イベントをリッスンしません。
たとえば、JCheckBox c1
(say)はButtonGroup
に追加されます。 JCheckBoxes
内の他のButtonGroup
の状態を変更しても、他のActionEvent
上のJCheckBox
は起動されず、代わりにItemEvent
が起動されます。
最後の言葉:ユーザーが別のItemEvent
を選択してチェックボックスの選択を解除しても、JCheckBox
が起動されます( ButtonGroup
)、ただしActionEvent
はそのように生成されず、代わりにActionEvent
はJCheckBox
(ActionListener
は登録済みのみ)またはそうではありません。 ButtonGroup
およびその他すべての選択/選択解除については知りません。
参考のため、違いを示す 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();
}
});
}
}
JButtonsにはaddActionListener
を使用しますが、addItemListener
はJToggleButton
に便利です。 if(event.getStateChange()==ItemEvent.SELECTED)
と一緒に、後者の場合、JToggleButtonがチェック/チェック解除されるたびにイベントを追加します。
私はこれを自分でテストし、この投稿のすべての答えを見てきましたが、彼らがこの質問によく答えているとは思いません。良い答えを得るために自分で実験しました(以下のコード)。ラジオボタンまたはチェックボックス、または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);
}
}
}
}