JCheckbox-ActionListener 및 ItemListener?
ActionListener와 ItemListener 모두 JCheckBox로 이벤트를 발생시키는 데 사용됩니까?
그렇다면 그들 중 하나가 다른 것보다 선호되는 경우 차이점은 무엇입니까?
두 ItemListener
뿐만 아니라 ActionListener
,의 경우는 JCheckBox
같은 동작을합니다. 그러나 큰 차이점은 확인란 ItemListener
을 호출하여 트리거 할 수 있습니다 setSelected(true)
. 모두를 등록하지 않는 코딩 연습으로 ItemListener
뿐만 아니라 ActionListener
과 JCheckBox
피할 불일치하기 위해,.
차이점은 마우스로 클릭하거나 스페이스 바 또는 니모닉으로 클릭하여 상태가 변경된다는 점 ActionEvent
에서 작업이 수행 될 때 시작 JCheckBox
된다는 것입니다. 이 선택 또는 선택 취소 여부에 관계없이 변경 이벤트를 실제로 수신 하지 않습니다 JCheckBox
.
예를 들어, JCheckBox c1
(말)이 ButtonGroup
. 기타의 상태를 변경 JCheckBoxes
에서하는 ButtonGroup
을 발생하지 않습니다 ActionEvent
다른 한편으로 JCheckBox
, 대신이 ItemEvent
발생합니다.
마지막 단어 : An ItemEvent
은 사용자가 다른 확인란을 선택하여 확인란을 선택 취소하더라도 JCheckBox
(a에서 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
하는 동안 JButton의에 대한 addItemListener
A에 대한 더 편리합니다 JToggleButton
. 와 함께 if(event.getStateChange()==ItemEvent.SELECTED)
후자의 경우 JToggleButton이 선택 / 선택 취소 될 때마다 이벤트를 추가합니다.
나는 이것을 직접 테스트 하고이 게시물의 모든 답변을 살펴 보았고 그들이이 질문에 잘 대답하지 않는다고 생각합니다. 나는 좋은 대답을 얻기 위해 자신을 실험했습니다 (아래 코드). 라디오 버튼이나 체크 박스에서 상태가 변경 될 때마다 ActionListener와 ItemListener 모두를 사용하여 이벤트를 100 % 발생시킬 수 있습니다. 또는 Object 유형이기 때문에 제가 가정하고있는 다른 종류의 Swing 항목입니다. 이 두 리스너간에 내가 알 수있는 유일한 차이점은 리스너와 함께 반환되는 이벤트 객체의 유형이 다르다는 것입니다. 그리고 ActionListener가 아닌 ItemListener를 사용하는 확인란으로 더 나은 이벤트 유형을 얻습니다.
ActionEvent 및 ItemEvent의 반환 유형에는 이벤트 유형이 시작될 때 사용할 수있는 다른 메서드가 저장됩니다. 아래 코드에서 주석은 각 클래스에서 반환 된 이벤트 유형에 대한 .get 메서드의 차이점을 보여줍니다.
아래 코드는 버튼 구성에 따라 변경되는 JRadioButtons, JCheckBoxes 및 JLabel 디스플레이로 간단한 JPanel을 설정합니다. Action Listener와 Item Listener를 모두 사용하여 모든 RadioButton 및 CheckBox를 설정했습니다. 그런 다음이 실험에서 먼저 테스트했기 때문에 ActionListener가 완전히 주석 처리 된 아래 Listener 클래스를 작성했습니다. 이 패널을 프레임 및 디스플레이에 추가하면 리스너 유형에 관계없이 모든 라디오 버튼과 확인란이 항상 실행된다는 것을 알 수 있습니다. 하나의 메서드를 주석 처리하고 다른 메서드를 시도하거나 그 반대의 경우도 마찬가지입니다.
구현 된 메소드에 대한 리턴 유형은 둘 사이의 주요 차이점입니다. 두 리스너 모두 동일한 방식으로 이벤트를 발생시킵니다. 위의 주석에서 조금 더 잘 설명 된 것은 반환되는 이벤트 유형으로 인해 확인란이 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);
}
}
}
}
참조 URL : https://stackoverflow.com/questions/9882845/jcheckbox-actionlistener-and-itemlistener
'developer tip' 카테고리의 다른 글
C ++ cout이 과학적 표기법을 사용하지 않도록하는 방법 (0) | 2020.12.24 |
---|---|
파이썬의 While 루프에 할당? (0) | 2020.12.24 |
Azure 저장소 테이블과 SQL (0) | 2020.12.24 |
PHP const 배열 (0) | 2020.12.24 |
Winforms : Application.Exit 대 Enviroment.Exit 대 Form.Close (0) | 2020.12.24 |