Java 查找addActionListener的正确参数

Java 查找addActionListener的正确参数,java,jframe,jbutton,actionlistener,Java,Jframe,Jbutton,Actionlistener,我正在尝试制作一个按钮,当按下时可以切换按钮的状态(改变颜色和文本)。但是我无法让addActionListener工作,也无法从我的主类中找到ToggleState方法。我是java新手,非常感谢您的帮助 我得到了错误 -“类型AbstractButton中的方法addActionListener(ActionListener)不适用于参数” -“ActionListener无法解析为类型” 这是按钮类 package Grafiktest; import javax.swing.*; im

我正在尝试制作一个按钮,当按下时可以切换按钮的状态(改变颜色和文本)。但是我无法让addActionListener工作,也无法从我的主类中找到ToggleState方法。我是java新手,非常感谢您的帮助

我得到了错误 -“类型AbstractButton中的方法addActionListener(ActionListener)不适用于参数” -“ActionListener无法解析为类型”

这是按钮类

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

}

}

要完成@Japu_D_Cret的评论:

您需要将
toggleState
方法设置为静态,以便像在
actionPerformed
方法中那样调用它,或者使用按钮调用它:

button.toggleState(Color.green, Color.red, "RUN","STOP");
因为它是在
MyButton
类中定义的方法,而不是在
coolgrafik
类中定义的方法

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

您没有导入ActionListener类,因为它不在java.awt.*中,而是在java.awt.event.ActionListener中-供参考

但是我仍然不能使用actionperformer的toggleState方法。为什么

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

显然,您希望在类
MyButton
的对象
按钮上调用
toggleState
方法,为此,您必须在该对象上调用方法,如
按钮。toggeState(…)
这也不会直接起作用,因为您的对象
按钮
仅在构造函数中已知,并且您必须向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);
//...
还有你的方法

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

让我们停下来想一想你想做什么。你想改变按下按钮时的状态

真正的问题是,谁真正负责这么做?任何监控按钮的
ActionListener
都应该专注于执行他们需要做的工作,而不是管理按钮,当按钮上连接了多个
ActionListener
时会发生什么?那么谁来负责呢?

如果我们让按钮自我管理呢?也就是说,按钮监视自身并相应地更新其状态

因为您无论如何都需要管理选中的状态,所以我使用了
JToggleButton
,因为它在内部具有“选中”/“未选中”状态

public class MyButton extends JToggleButton {

    private static final long serialVersionUID = 1L;

    public class State {
        public Color color;
        public String text;

        public State(Color color, String text) {
            this.color = color;
            this.text = text;
        }

    }

    private final State unselectedState;
    private final State selectedState;

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

        selectedState = new State(c1, s1);
        unselectedState = new State(c2, s2);

        setContentAreaFilled(false);
        setBorderPainted(false);
        setFocusPainted(false);
        setOpaque(true);

        toggleState();

        getModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                toggleState();
            }
        });

    }

    public void toggleState() {

        State state = !getModel().isSelected() ? selectedState : unselectedState;

        setText(state.text);
        setForeground(Color.WHITE);
        setBackground(state.color);

    }
}
基本上,所有这些操作都会根据
按钮模型
选定状态配置按钮


您可以使用
ActionListener
并以类似的方式将其直接注册到按钮本身,但您需要管理它使用的状态

您没有导入ActionListener类,因为它不在
java.awt.*
中,而是在
java.awt.event.ActionListener
中-供参考-也谢谢,thalittle line解决了我的actionlistener问题。但我仍然无法使用actionperformer中的toggleState方法。为什么呢?
MyButton
监控自己的模型状态可能会更好它工作了!但我不完全理解它是如何工作的。我读过关于this关键字的文章,但我看不出它在这种情况下有什么帮助。你知道吗nd给我一个解释?@G.Dog
this.button
意味着您明确地想要使用对象属性
button
,您也可以只使用
button
,并得到相同的结果,只要该方法不同时声明一个名为
button
的变量。
this
-关键字的符号是in我认为更清晰,更不可能破坏你的代码,因为它总是使用object属性。但它不会使你的代码变慢,也不会使代码变快,它只是使用起来非常方便,也不太随意-请参阅,好吧,我现在更了解它。但是我将ActionListener改为MyButton类。我可以让他使用MyButton构造函数从coolgrafik构造函数中的MyButton调用获取的参数执行了方法调用toggleState?例如类似于“toggleState(c1、c2、s1、s2)“@G.Dog of you can–要做到这一点,您必须将对象保存为属性,这是您在构造函数中获得的属性–因此,对于每种颜色和字符串,您都要添加一个属性(
private color c1;private string s1;//…
),并在构造函数中为该属性赋值。然后,如果您想用保存的对象调用toggleState,您可以使用
toggeState(this.c1,this.s1,…)
I将(私有颜色c1;私有字符串s1;/…)定义为我的构造函数上的字段,然后尝试在构造函数中以颜色c1=c1的形式给它们赋值;颜色c2=this.c2等,但这是不可能的。我误解你了吗?复制局部变量c1时出错
public class MyButton extends JToggleButton {

    private static final long serialVersionUID = 1L;

    public class State {
        public Color color;
        public String text;

        public State(Color color, String text) {
            this.color = color;
            this.text = text;
        }

    }

    private final State unselectedState;
    private final State selectedState;

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

        selectedState = new State(c1, s1);
        unselectedState = new State(c2, s2);

        setContentAreaFilled(false);
        setBorderPainted(false);
        setFocusPainted(false);
        setOpaque(true);

        toggleState();

        getModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                toggleState();
            }
        });

    }

    public void toggleState() {

        State state = !getModel().isSelected() ? selectedState : unselectedState;

        setText(state.text);
        setForeground(Color.WHITE);
        setBackground(state.color);

    }
}