1

我在 JButton 上设置 ActionListener 时遇到了一些麻烦,这里是代码...

package pipes;

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

public class PipesUI extends javax.swing.JFrame {

    Main main = new Main();

    JButton addPipeButton = new JButton("Add Pipe");

    public PipesUI(){
        addUI();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void addUI(){
        addPipeButton.addActionListener(this);
    }

     public void actionPerformed(ActionEvent e){
      if (e.getSource()==addPipeButton)
          main.addPipe();
       else
          ;
    }

    public static void main(String args[]) {
        PipesUI pipesUI = new PipesUI(); //  create an instance of the menu
        pipesUI.setSize(500,500);
        pipesUI.setVisible(true);
    }
}

错误在于 addPipeButton.addActionListener(this);

(这个)它似乎不喜欢,错误说'不兼容的类型:PipesUI 无法转换为 ActionListener'

任何帮助都会非常感谢。

4

4 回答 4

6

您创建了actionPerformed方法,但没有将您的类声明为ActionListener. 实现该接口:

public class PipesUI extends javax.swing.JFrame implements ActionListener {
于 2013-11-08T17:44:39.633 回答
3
addPipeButton.addActionListener(this);

在实例方法或构造函数中,this是对当前对象的引用——正在调用其方法或构造函数的对象。因此,该addActionListener(ActionListener)方法需要一个已实现的 interface 实例ActionListener。当您传递thisaddActionListener函数时,该函数当前引用的实例PipesUI未使用ActionListener.

执行ActionListener如下:

public class PipesUI extends javax.swing.JFrame implements ActionListener
{
 //your code


  @Override
  public void actionPerformed(ActionEvent e) {
    // your code
  }

}

但是从您的代码中,我没有看到您已将其添加addPipeButton到任何容器中。PipesUI只需使用add(addPipeButton)如下所示将按钮添加到您的框架:

private void addUI(){
    add(addPipeButton);    <--- adding pipe button
    addPipeButton.addActionListener(this);
}

Jframe.add(addPipeButton)会将addPipeButton按钮添加到框架的内容窗格中,该窗格具有BorderLayout默认布局管理器。

于 2013-11-08T17:50:04.527 回答
2

我猜你addActionListener(this)在另一个地方看到并决定在这里使用它。另一个地方是完全不同的上下文,thisActionListner 的一个实例也是如此。

执行以下操作:

addPipeButton.addActionListener(new ActionListner(){
    public void actionPerformed(ActionEvent e){
        //handle `e`
    }
});

编辑:您的课程中已经有ActionListener方法。在这种情况下,您可以使用:

public class PipesUI extends javax.swing.JFrame implements ActionListener {
于 2013-11-08T17:45:00.323 回答
2

一种可能的解决方案:

public class PipesUI extends javax.swing.JFrame implements ActionListener{
 //implement the relevant methods

其他:

private void addUI(){
    addPipeButton.addActionListener(new ActionListener(){
        //anonymous actionlistener implementation
    };
}

等等等等。

于 2013-11-08T17:45:18.560 回答