选择列表项时,JoptionPane 显示两次
JoptionPane is showed two times when a list item is selected
当我单击 JComboBox 的项目以显示带有所选项目文本的 JoptionPane 时,它显示了两次。如何停用项目侦听器事件?
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
public class Combo implements ItemListener {
JFrame f;
JComboBox cb;
Combo() {
f = new JFrame("Combo ex");
String country[] = {"India", "Aus", "U.S.A", "England", "Newzeland"};
cb = new JComboBox(country);
cb.setBounds(50, 50, 90, 20);
f.add(cb);
cb.addItemListener(this);
f.setLayout(null);
f.setSize(400, 500);
f.setVisible(true);
}
public static void main(String[] args) {
new Combo();
}
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getSource()==cb) {
String seleccionado=(String)cb.getSelectedItem();
JOptionPane.showMessageDialog(f, seleccionado);
}
}
}
您想避免覆盖 itemStateChanged()。在 itemStateChanged 中更改项目的状态会导致 itemStateChanged 被触发...这就是为什么您会看到该对话框两次。您应该改用 ActionListener。
我略微修改了您的代码作为示例。它现在应该只显示 1 个对话框。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Combo{
JFrame frame;
JComboBox cb;
Combo() {
frame = new JFrame("Combo ex");
String country[] = {"India", "Aus", "U.S.A", "England", "Newzeland"};
cb = new JComboBox(country);
cb.setBounds(50, 50, 90, 20);
cb.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String seleccionado=(String)cb.getSelectedItem();
JOptionPane.showMessageDialog(frame, seleccionado);
}
});
frame.add(cb);
frame.setLayout(null);
frame.setSize(400, 500);
frame.setVisible(true);
}
public static void main(String[] args) {
new Combo();
}
}
问题是,当用户select编辑或删除select某个项目时,将调用itemStateChanged()
。简单来说,当您 select 一个新项目时,您也删除了 select 旧项目。
试试这个:
if (e.getSource()==cb && e.getStateChange() == ItemEvent.SELECTED) {
//
}
getStateChange(),returns 状态改变的类型(selected 或 deselected)。
当我单击 JComboBox 的项目以显示带有所选项目文本的 JoptionPane 时,它显示了两次。如何停用项目侦听器事件?
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
public class Combo implements ItemListener {
JFrame f;
JComboBox cb;
Combo() {
f = new JFrame("Combo ex");
String country[] = {"India", "Aus", "U.S.A", "England", "Newzeland"};
cb = new JComboBox(country);
cb.setBounds(50, 50, 90, 20);
f.add(cb);
cb.addItemListener(this);
f.setLayout(null);
f.setSize(400, 500);
f.setVisible(true);
}
public static void main(String[] args) {
new Combo();
}
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getSource()==cb) {
String seleccionado=(String)cb.getSelectedItem();
JOptionPane.showMessageDialog(f, seleccionado);
}
}
}
您想避免覆盖 itemStateChanged()。在 itemStateChanged 中更改项目的状态会导致 itemStateChanged 被触发...这就是为什么您会看到该对话框两次。您应该改用 ActionListener。
我略微修改了您的代码作为示例。它现在应该只显示 1 个对话框。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Combo{
JFrame frame;
JComboBox cb;
Combo() {
frame = new JFrame("Combo ex");
String country[] = {"India", "Aus", "U.S.A", "England", "Newzeland"};
cb = new JComboBox(country);
cb.setBounds(50, 50, 90, 20);
cb.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String seleccionado=(String)cb.getSelectedItem();
JOptionPane.showMessageDialog(frame, seleccionado);
}
});
frame.add(cb);
frame.setLayout(null);
frame.setSize(400, 500);
frame.setVisible(true);
}
public static void main(String[] args) {
new Combo();
}
}
问题是,当用户select编辑或删除select某个项目时,将调用itemStateChanged()
。简单来说,当您 select 一个新项目时,您也删除了 select 旧项目。
试试这个:
if (e.getSource()==cb && e.getStateChange() == ItemEvent.SELECTED) {
//
}
getStateChange(),returns 状态改变的类型(selected 或 deselected)。