ActionListener와 ItemListener는 모두 JCheckBox로 이벤트를 발생시키는 데 사용됩니까?JCheckbox - ActionListener 및 ItemListener?
그래서 차이점은 무엇입니까? 어떤 경우에는 다른 쪽보다 우선적입니까?
ActionListener와 ItemListener는 모두 JCheckBox로 이벤트를 발생시키는 데 사용됩니까?JCheckbox - ActionListener 및 ItemListener?
그래서 차이점은 무엇입니까? 어떤 경우에는 다른 쪽보다 우선적입니까?
JCheckBox
의 경우, ActionListener
뿐만 아니라 ItemListener
도 동일한 동작을합니다. 그러나 큰 차이는 ItemListener
입니다.이 확인란을 선택하면 setSelected(true)
으로 전화를 걸 수 있습니다. 코드 연습으로 ItemListener
과 ActionListener
을 JCheckBox
으로 등록하지 마십시오. 불일치가 발생하지 않습니다.
다음은 차이점을 보여주는 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();
}
});
}
}
의 차이는 작업이 마우스로 또는로 클릭하여 상태 중 하나를 변경 것입니다 JCheckBox
수행 될 때 ActionEvent
해고된다는 것이다 스페이스 바 또는 연상 기호. 실제로JCheckBox
이 선택되거나 선택 취소되었는지 여부에 관계없이 이벤트를 수신 대기하십시오.
예를 들어, JCheckBox c1
(말)이 ButtonGroup
에 추가 된 경우. ButtonGroup
에있는 다른 JCheckBoxes
의 상태를 변경하면 ActionEvent
이 다른 JCheckBox
에 실행되지 않고 ItemEvent
이 해고됩니다.
결언 : 사용자가 (a ButtonGroup
의 경우) 다른 JCheckBox
을 선택하여 체크 박스의 선택을 취소하더라도ItemEvent
그러나 ActionEvent
만 동작이 수행된다 게 수신 여부 대신 ActionEvent
같이 생성되지 않고, 소성 JCheckBox
(ActionListener
이 등록되어있는 경우에만 해당). ButtonGroup
및 기타 모든 선택/선택 취소 항목에 대해서는 알지 못합니다.
JButton에 addActionListener
을 사용하고 JToggleButton
에는 addItemListener
이 더 편리합니다. if(event.getStateChange()==ItemEvent.SELECTED)
과 함께 후자의 경우 JToggleButton이 선택/선택 해제되지 않을 때마다 Events를 추가합니다.
나는이 테스트를 해본 결과이 게시물의 모든 대답을 살펴본 결과,이 질문에 매우 잘 대답하지 않는다고 생각합니다. 나는 좋은 대답 (아래 코드)을 얻기 위해 자신을 실험했다. 라디오 버튼이나 체크 박스에서 상태가 변경 될 때 ActionListener와 ItemListener 모두 100 %의 이벤트를 발생시킬 수 있습니다. 또는 Object 유형이기 때문에 가정하는 다른 종류의 Swing 항목을 사용할 수 있습니다. 이 두 리스너간에 유일한 차이점은 리스너와 함께 반환되는 이벤트 객체 유형이 다른 것입니다. ActionListener가 아닌 ItemListener를 사용하는 체크 박스를 사용하면 더 나은 이벤트 유형을 얻을 수 있습니다.
ActionEvent 및 ItemEvent의 반환 형식에는 이벤트 형식이 시작될 때 사용할 수있는 여러 가지 메서드가 저장됩니다. 아래의 코드는 각 클래스가 반환 한 이벤트 유형에 대한 .get 메소드의 차이점을 보여줍니다.
아래 코드는 버튼 구성에 따라 변경되는 JRadioButtons, JCheckBoxes 및 JLabel 디스플레이가있는 간단한 JPanel을 설정합니다. 모든 RadioButton 및 CheckBox를 Action Listener 및 Item Listener로 설정했습니다. 그런 다음이 실험에서 먼저 테스트했기 때문에 ActionListener가 완전히 주석 처리 된 Listener 클래스를 아래에 작성했습니다. 프레임과 디스플레이에이 패널을 추가하면 모든 라디오 버튼과 체크 박스는 리스너 유형에 관계없이 항상 실행되며 하나의 메소드를 주석으로 처리하고 다른 메소드를 시도하거나 그 반대의 경우도 마찬가지입니다.
리턴 된 유형은 구현 된 메소드에 MAIN의 차이가 있습니다. 두 리스너 모두 동일한 방식으로 이벤트를 시작합니다. 위의 주석에서 조금 더 자세히 설명하면 체크 박스가 반환되는 이벤트 유형으로 인해 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);
}
}
}
}
나는 한 사용자들이 체크 박스를 클릭 할 때 * *이 발사되지 ActionListener를보고, 또 어디 다른 차이를 발견하는 것 IU가있는 ItemListener, 이벤트가 발생에 코드를 전환 할 때. 그래서 actionPerformed fire가 L & F 또는 무엇인가에 달려 있을지 어떨지. – Trejkaz