【问题标题】:Error on basic Java program - cannot find symbol ActionListener()基本 Java 程序出错 - 找不到符号 ActionListener()
【发布时间】:2014-10-14 14:51:00
【问题描述】:

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

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

【问题讨论】:

  • 尝试导入 import java.awt.event.*
  • 就我而言,您需要首先解决来自guiFrame.close(); 的问题,编译器首先会抱怨这个问题。 Cannot refer to a non-final variable guiFrame inside an inner class defined in a different method
  • 错误消息btn.addActionListener( new actionListener(){ --> 应该是ActionListener。好像您的代码与错误信息不符?
  • 我不知道为什么没有人指出guiFrame.close() 是代码不起作用的原因之一。

标签: java


【解决方案1】:

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

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

这是工作代码。

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);

    }
}

【讨论】:

  • 做到了,但为什么呢?第一行不应该已经包含了吗?
  • 不,通配符指的是类,而不是子包(实际上不存在)。如果没有,那么import java.* 对于大多数 java 程序来说就足够了
  • 使用import,我们导入classesenumsinterfaces等,而不是包或包内的元素。 @JohnS 还有 1 个错误,您正在使用不存在的 close() 方法。
【解决方案2】:

ActionListenerjava.awt.event 包中。如果你导入那个包,它应该可以工作。

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

查看here 了解更多详情,位于“包的表观层次结构”下。

【讨论】:

  • java.awt.* 不导入 java.awt 命名空间下的所有库吗?
  • @JohnS No : "导入 java.awt.* 会导入 java.awt 包中的所有类型,但不会导入 java.awt.color、java.awt.font 或任何其他 java.awt.xxxx 包。如果您打算使用 java.awt.color 和 java.awt 中的类和其他类型,则必须导入这两个包及其所有文件"
  • @Mohammad,他导入的是 java.awt 包,而不是 java.awt.event 包。
  • java.awt.* 确实包含java.awt.event
  • @Mohammad,不,它没有。从我附上的链接;导入 java.awt.* 会导入 java.awt 包中的所有类型,但不会导入 java.awt.color、java.awt.font 或任何其他 java.awt.xxxx 包。如果您计划使用 java.awt.color 和 java.awt 中的类和其他类型,则必须导入这两个包及其所有文件:
【解决方案3】:

没有包的层次结构。

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)

【讨论】:

    猜你喜欢
    • 2013-09-11
    • 2016-03-20
    • 2013-09-28
    • 1970-01-01
    • 2017-10-13
    • 2013-05-20
    • 2013-12-06
    • 2016-07-22
    相关资源
    最近更新 更多