【问题标题】:Java Swing adding action listener to combo boxJava Swing 将动作监听器添加到组合框
【发布时间】:2015-08-02 09:13:42
【问题描述】:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Combo extends JFrame implements ActionListener {
   public Combo() {
    setSize(500,500);
    setLayout(new FlowLayout());
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
    String[] country=new String[]{"INDIA","AMERICA","NIGERIA"};
    JComboBox comboBox=new JComboBox<String>(country);
    comboBox.setEditable(true);
    comboBox.addActionListener(this);
    add(comboBox);
  }
  public void actionPerformed(ActionEvent e) {
    JComboBox comboBox=(JComboBox) e.getSource();
    String s1=(String) comboBox.getSelectedItem();
    String s2=(String) comboBox.getActionCommand();

   System.out.println(s1);
   System.out.println(s2);
 }
 public static void main(String args[]) {
   new Combo();
 }
}

这段代码可以完美编译,但是在运行代码时,comboBox 不起作用....它没有显示在摇摆中:(帮助

【问题讨论】:

  • 也许您应该在setVisible 之前添加或致电revalidate
  • 就像@GáborBakos 所说的在add(comboBox);987654324@
  • 谢谢它的工作大声笑
  • 解决您的问题的正确方法是从 EDT 运行您的程序,其他的只是铺路。

标签: java swing actionlistener jcombobox


【解决方案1】:

您应该从 EDT 线程运行您的程序:

public static void main(String args[]) {
  SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
      new Combo();
    }
  });
}

在摇摆中,对摇摆对象的每次操作都应在 EDT 内进行。请参阅swing tutorial

EDT 是事件调度线程。在这个线程中,swing 完成了所有的奇迹:处理点击事件以将其传递给您的听众,重新绘制所有内容。由于 swing 不是线程安全的,因此您不应该在 EDT 之外访问 swing 对象。有大量关于 EDT 的资源,例如 Swing tutorial from sun/oracle

【讨论】:

  • 实际上,我是 java 新手,已经学习了 20 天,只是太温和了,所以我不知道 EDT 是什么 :( 听起来很愚蠢,但我现在会去检查并阅读它: )
【解决方案2】:

你的代码应该是这样的

public class Combo extends JFrame implements ActionListener {

public Combo() {

String[] country=new String[]{"INDIA","AMERICA","NIGERIA"};
JComboBox comboBox=new JComboBox<String>(country);
comboBox.setEditable(true);
comboBox.addActionListener(this);
add(comboBox);

setSize(500,500);
setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);

}

【讨论】:

  • 感谢您的回答!请在代码中附上解释,以提供最佳答案。
【解决方案3】:

如上所述,在 EDT 线程中运行程序是正确的方法,但是如果您想以不同的方式进行操作(尽管不太推荐),您可以在更新值后调用方法:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;

    public class Combo extends JFrame implements ActionListener {
        public Combo() {
        setSize(500,500);
        setLayout(new FlowLayout());
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
    String[] country=new String[]{"INDIA","AMERICA","NIGERIA"};
    JComboBox comboBox=new JComboBox<String>(country);
    comboBox.setEditable(true);
    comboBox.addActionListener(this);
    add(comboBox);
    revalidate();
    repaint();

  }
  public void actionPerformed(ActionEvent e) {
    JComboBox comboBox=(JComboBox) e.getSource();
    String s1=(String) comboBox.getSelectedItem();
    String s2=(String) comboBox.getActionCommand();

   System.out.println(s1);
   System.out.println(s2);
 }
 public static void main(String args[]) {
   new Combo();
 }
}

【讨论】:

  • 我在applet中学习了paint方法但是swings中没有paint方法.....
  • you can call the methods after you've updated the values: - 这不仅是一个糟糕的建议,而且代码的顺序也是错误的。顺序应该是 revalidate()(调用布局管理器),然后是 repaint()(在新位置和大小处绘制组件)。
猜你喜欢
  • 2013-04-24
  • 1970-01-01
  • 2012-01-23
  • 2012-06-02
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多