基本Java程序出错 - 无法找到符号ActionListener()

时间:2014-10-14 14:51:01

标签: java

我将以下HelloWorld类型的程序拼凑在一起,打开一个窗口,显示一个按钮,然后通过关闭窗口来处理按钮单击。编译我正在添加ActionListener以处理click事件的部分时出现错误。查看网络上的其他示例和教程,看起来应该可行。有什么想法吗?

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

public class MyTest{
public static void main(String args[]) throws Exception {

    JFrame guiFrame = new JFrame("Test Frame");
    guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    guiFrame.setTitle("Example GUI"); 
    guiFrame.setSize(300,250);  
    guiFrame.setLocationRelativeTo(null);  

      JButton btn = new JButton("Hit Me");

      btn.addActionListener( new ActionListener(){
      @Override
      public void actionPerformed(ActionEvent event)
      {
      guiFrame.close();
      }
     });
      guiFrame.add(btn, BorderLayout.SOUTH);
      guiFrame.setVisible(true);

}
}

错误:

javac MyTest.java
MyTest.java:17: error: cannot find symbol
          btn.addActionListener( new actionListener(){
                                     ^
  symbol:   class actionListener
  location: class MyTest
1 error

3 个答案:

答案 0 :(得分:2)

ActionListener位于java.awt.event包中。如果您导入该包,它应该可以工作。

import java.awt.*;语句不会导入java.awt.event类所在的ActionListener包。要导入,您需要单独`import java.awt.event。*;'

查看here以获取更多详细信息,包括'包的显式层次结构'。

答案 1 :(得分:2)

以下代码正常运行,以下是我所做的:

  1. 添加import java.awt.event.*;
  2. 删除不必要的import java.util.*;
  3. guiFrame.close()替换为guiFrame.dispose(); ,因为没有Frame.close()方法。
  4. 这是工作代码。

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class MyTest {
    
        public static void main(String args[]) throws Exception {
    
            JFrame guiFrame = new JFrame("Test Frame");
            guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            guiFrame.setTitle("Example GUI");
            guiFrame.setSize(300, 250);
            guiFrame.setLocationRelativeTo(null);
    
            JButton btn = new JButton("Hit Me");
    
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent event) {
                    guiFrame.dispose();
                }
            });
            guiFrame.add(btn, BorderLayout.SOUTH);
            guiFrame.setVisible(true);
    
        }
    }
    

答案 2 :(得分:1)

没有包的层次结构。

java.awt.event不是java.awt的子包。因此import java.awt.*不会导入java.awt.event的类。

  

首先,包似乎是分层的,但它们不是。对于   例如,Java API包含一个java.awt包,一个java.awt.color   包,一个java.awt.font包,以及许多其他包   java.awt中。但是,java.awt.color包,java.awt.font   包和其他java.awt.xxxx包不包含在   java.awt包。前缀java.awt(Java抽象窗口   Toolkit)用于制作许多相关的包   关系明显,但不表示包容。

     

导入java.awt。*导入java.awt包中的所有类型,   但它不会导入java.awt.color,java.awt.font或任何其他内容   java.awt.xxxx包。如果您打算使用类和其他类型   在java.awt.color以及java.awt中,必须同时导入它们   打包包含所有文件:

import java.awt.*;
import java.awt.color.*;`

Source