【问题标题】:Java Swing method addActionListener errorJava Swing方法addActionListener错误
【发布时间】:2016-06-07 14:42:00
【问题描述】:

我是 Java 新手,正在尝试创建一个带有两个按钮的简单 Swing 程序,但我收到了 addActionListener 错误。

public class swingEx1  
{
   JFrame f;
   JPanel p;
   JLabel l;
   JButton b1,b2;

   public swingEx1()
   {
      f = new JFrame("Swing Example");
      p = new JPanel();
      l = new JLabel("Initial Label");
      b1 = new JButton("Clear");
      b2 = new JButton("Copy");
   }

   public void launchFrame()
   {
      p.add(b1,BorderLayout.SOUTH);
      p.add(b2,BorderLayout.EAST);
      p.add(l,BorderLayout.NORTH);
      p.setSize(200,300);
      f.getContentPane().add(p);
      b1.addActionListener(new ClearButton());
      b2.addActionListener(new CopyButton());
      f.pack();
      f.setVisible(true);
   }

   public static void main(String args[])
   {
      swingEx1 swObj1 = new swingEx1();
      swObj1.launchFrame();
   }
}

class ClearButton implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        Button b1 = (Button) e.getSource();
        b1.setLabel("It it Clear Button");
    }
}

class CopyButton implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        Button b2 = (Button) e.getSource();
        b2.setLabel("It it Copy Button");
    }
}

b1.addActionListener(new ClearButton()) 行产生错误:

类型中的方法addActionListener(ActionListener) AbstractButton 不适用于参数(ClearButton)

b2.addActionListener(new CopyButton()) 行产生错误:

类型中的方法addActionListener(ActionListener) AbstractButton 不适用于参数(CopyButton)

【问题讨论】:

  • 对我来说编译得很好。 1) 类名应以大写字符开头。 2)您是否拥有所有正确的导入语句。 3) ActionListener 代码应该引用JButton 而不是“按钮”。
  • 我没有收到您描述的错误,但是我确实收到了 JButtonButton 转换错误。将所有 Button 引用替换为 JButton
  • 我正在使用这两个导入:import javax.swing.*import java.awt.*,并使用 Eclipse 版本:Mars.2 Release (4.5.2)。即使将 Button 更改为 JButton Eclipse 也会产生相同的错误。

标签: java swing


【解决方案1】:

在您的两个内部类中,您应该使用 JButton,而您正在使用 Button。这可能就是你得到例外的原因。我使用建议的更改运行了您的代码,但没有出现错误。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class swingEx1 {

    JFrame f;
    JPanel p;
    JLabel l;
    JButton b1, b2;

    public swingEx1() {
        f = new JFrame("Swing Example");
        p = new JPanel();
        l = new JLabel("Initial Label");
        b1 = new JButton("Clear");
        b2 = new JButton("Copy");
    }

    public void launchFrame() {
        p.add(b1, BorderLayout.SOUTH);
        p.add(b2, BorderLayout.EAST);
        p.add(l, BorderLayout.NORTH);
        p.setSize(200, 300);
        f.getContentPane().add(p);
        b1.addActionListener(new ClearButton());
        b2.addActionListener(new CopyButton());
        f.pack();
        f.setVisible(true);
    }

    public static void main(String args[]) {
        swingEx1 swObj1 = new swingEx1();
        swObj1.launchFrame();
    }
}

class ClearButton implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        JButton b1 = (JButton) e.getSource();
        b1.setLabel("It it Clear Button");
    }
}

class CopyButton implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        JButton b2 = (JButton) e.getSource();
        b2.setLabel("It it Copy Button");
    }
}

【讨论】:

  • 即使对 JButton 进行了更改,使用 Eclipse 版本时也会出现同样的错误:Mars.2 Release (4.5.2)
  • 我刚刚在 Eclipse 中运行良好,没有出现错误。
  • 你使用什么进口产品?您是否将所有内容都放在一个名为 SwingEx1.java 的文件中?
  • 我更新了代码以显示包括导入在内的所有内容
【解决方案2】:

我将您的 ActionListener 类(在您的代码中是一个单独的默认访问类)调整为内部类,并将 Button 更改为 JButton。它有效。

 class ClearButton implements ActionListener
   {
       public void actionPerformed(ActionEvent e)
       {
           JButton b1 = (JButton) e.getSource();
           b1.setLabel("It it Clear Button");
       }
   }

GUI 显示如下: 1.点击前: Panel before clicking 2.点击后: panel after clicking

【讨论】:

  • 进口包括:javax.swing.*; java.awt.*; java.awt.event.
【解决方案3】:

我更改了我的导入来源:

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

到:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

这解决了问题。不知道为什么原始导入不起作用。

【讨论】:

  • 你错过了import java.awt.event.*;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 2011-06-09
  • 2012-10-11
  • 2020-06-28
  • 1970-01-01
相关资源
最近更新 更多