Java Swing方法addActionListener错误

时间:2016-06-07 14:42:01

标签: java swing

我是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)

3 个答案:

答案 0 :(得分: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");
    }
}

答案 1 :(得分:0)

我将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

答案 2 :(得分:0)

我改变了我的导入:

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;

这解决了这个问题。不确定原来的进口为什么不起作用。