我正在尝试制作一个在按下时切换按钮状态(更改颜色和文本)的按钮。但是我无法使addActionListener正常工作,也无法从主类中找到ToggleState方法。我是Java新手,不胜感激。

我得到错误
 -“ AbstractButton类型的方法addActionListener(ActionListener)不适用于自变量”
-“ ActionListener无法解析为类型”

package Grafiktest;

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

public class coolgrafik extends JFrame implements ActionListener {

private static final long serialVersionUID = 1L;
private JPanel panel;
private JLabel label;

public coolgrafik(){

    //super(title);
    setSize(400,60);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel = new JPanel();
    panel.setBackground(Color.GRAY);
    label = new JLabel("test");
    panel.add(label);

    MyButton button = new MyButton(Color.green, Color.red, "RUN","STOP");
    panel.add(button);
    button.addActionListener(this);

    add(panel);
}

public static void main(String[] args){
    new coolgrafik().setVisible(true);
    //toggleState(Color.green, Color.red, "RUN","STOP");
}

public void actionPerformed(ActionEvent e) {
    toggleState(Color.green, Color.red, "RUN","STOP");
}
}


这是按钮类

package Grafiktest;

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

public class MyButton extends JButton{

private static final long serialVersionUID = 1L;

public MyButton(Color c1, Color c2, String s1, String s2){

    setText(s1);
    setForeground(c1);
    setBackground(c1);
    setOpaque(true);

}

public void toggleState(Color c1, Color c2, String s1, String s2){

    setText(s2);
    setForeground(c2);
    setBackground(c2);
    setOpaque(true);

}


}

最佳答案

“类型为AbstractButton的方法addActionListener(ActionListener)不适用于参数”-“无法将ActionListener解析为类型”


您没有导入ActionListener类,因为它不在java.awt。*中,而是在java.awt.event.ActionListener中-供参考https://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionListener.html


  但是我仍然不能使用来自actionperformer的toggleState方法。怎么来的?


在您的void actionPerformed(ActionEvent)中,您尝试调用一个名为void toggleState(Color,Color,String,String)的方法-但它不是在同一类中声明的,也不是静态导入的。

您显然想在类toggleState的对象button上调用MyButton方法,为此您必须像button.toggeState(...)那样在该对象上调用方法
这也不会直接起作用,因为您的对象button仅在构造函数中已知,并且您必须像在面板上一样将对象属性添加到coolgrafik类中-然后它应该可以正常工作

这是您在coolgrafik类中需要更改的代码片段

属性:

private JPanel panel;
private JLabel label;
private MyButton button;


在您的coolgrafik构造函数中

//...
this.button = new MyButton(Color.green, Color.red, "RUN","STOP");
this.panel.add(this.button);
this.button.addActionListener(this);
//...


和你的actionPerformed方法

public void actionPerformed(ActionEvent e) {
    button.toggleState(Color.green, Color.red, "RUN","STOP");
}

09-30 14:41
查看更多