5 ответов:
и
ItemListenerа такжеActionListenerв случаеJCheckBoxимеют такое же поведение. Однако, главное отличиеItemListenerможет быть вызван вызовомsetSelected(true)на флажке. В качестве практики кодирования не регистрируйте обаItemListenerа такжеActionListenerСJCheckBox, во избежание несогласованности.
разница в том, что
ActionEventсрабатывает, когда действие выполняется наJCheckBoxто есть его состояние изменяется либо щелчком по нему мышкой, либо пробелом или мнемоникой. Это не действительно слушайте, чтобы изменить события лиJCheckBoxвыбран или невыбранным.например, если
JCheckBox c1(скажем) добавляется кButtonGroup. Изменение состояния другихJCheckBoxesнаButtonGroupне будет стрелятьActionEventдругиеJCheckBox, вместо anItemEventуволен.последние слова: An
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(); } }); } }
Я использую
addActionListenerдля JButtons whileaddItemListenerудобнее дляJToggleButton. Вместе сif(event.getStateChange()==ItemEvent.SELECTED), в последнем случае я добавляю события всякий раз, когда jtogglebutton проверен/снят.
Я проверял это сам, и глядя на все ответы на этом посту, и я не думаю, что они отвечают на этот вопрос очень хорошо. Я экспериментировал сам, чтобы получить хороший ответ (код ниже). Вы можете запустить любое событие с помощью ActionListener и ItemListener 100% времени, когда состояние изменяется либо в переключателе, либо в флажке, либо в любом другом элементе Swing, который я предполагаю, поскольку это объект типа. Единственное различие, которое я могу сказать между этими двумя слушателями-это тип объекта события, который возвращается с прослушивателем, отличается. И вы получаете лучший тип события с флажком, используя ItemListener, а не ActionListener.
возвращаемые типы ActionEvent и ItemEvent будут иметь разные методы, которые могут использоваться при запуске типа события. В коде ниже комментарии показывают разницу .получить методы для каждого класса возвращаемого типа события.
приведенный ниже код устанавливает простой JPanel с JRadioButtons, JCheckBoxes и jlabel отображают изменения, основанные на конфигурациях кнопок. Я установил все радиокнопки и флажки как с Прослушивателем действий, так и с Прослушивателем элементов. Затем я написал классы слушателя ниже с ActionListener полностью прокомментировал, потому что я проверил его сначала в этом эксперименте. Вы заметите, что если вы добавите эту панель в кадр и дисплей, все радиокнопки и флажки всегда срабатывают независимо от типа прослушивателя, просто закомментируйте методы в одном и попробуйте другой и наоборот.
возвращаемый тип в реализованные методы является главным отличием между ними. Оба слушателя запускают события одинаково. Объяснил немного лучше в комментарии выше является причиной флажок должен использовать ItemListener над ActionListener из-за типа события, которое возвращается.
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); } } } }
Comments