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