3 回答
TA贡献1803条经验 获得超6个赞
您的主要问题在这里:
private ActionListener listeners;
您创建了一个,ActionListener
但从未调用它。
您还继承ClickListener
但从未使用过它。
public class UserInterface extends ClickListener implements Runnable
在您的代码中,您调用:
b.addActionListener(listeners); //Listeners is null!
因此,您要告诉您JRadioButton
有一个监听器,即null
。
因此,这里有两种方法:
private ActionListener listeners;
从程序顶部删除并更改:b.addActionListener(listeners);
至:
b.addActionListener(this);
extends ClickListener
从类定义中删除并保留:b.addActionListener(listeners);
但是添加
listeners = new ClickListener();
前
createComponents(frame.getContentPane());
IMO我将采用第二种方法。
顺便说一句,您ActionListener
实际上可以更改文本,不需要private
变量,而是获取源并将其强制转换。例如:
public void actionPerformed(ActionEvent ae) { JRadioButton b = (JRadioButton) ae.getSource(); b.setText("this works");}
忘了提一下,请遵循Java命名约定,以便每个阅读它的人都可以更容易理解和理解您的程序。
firstWordLowerCaseVariable
firstWordLowerCaseMethod()
FirstWordUpperCaseClass
ALL_WORDS_UPPER_CASE_CONSTANT
并正确缩进您的代码:)
TA贡献1802条经验 获得超6个赞
您需要多少个程序员来更换灯泡?76,1更改它,75表示他们可以做得更好。
您确实有不好的代码实践,但是那通常是因为对语言设计背后的基本概念缺乏了解。因此,我不会评论您的代码对此有何不良影响,仅说明您应该了解的基本知识。
为简化起见,anActionListener是将对做出反应的对象ActionPerformedEvent。让我们定义一个,称为Observer的类:
观察者不知道是谁产生了该事件,所以让我们告诉他,如果它是一个JRadioButton,让我们将其用作一个事件。
public class Observer implements ActionListener{
@Override
public void ActionPerformed(ActionEvent ae){
Object source = ae.getSource();
if (source instanceof JRadioButton)
((JRadioButton) source).setText("this works");
}
您的JRadioButton中的任何一个都是ActionEvent不断生成s的对象,但是通常我们不在乎的是观察,当我们添加一个时,ActionListener我们基本上是在说:使该ActionListener对象遵守我的行为。
因此,我们需要一个观察者和一个观察者,让它们在您的UI(或其简化版本)中进行制作: 由于您尝试使用全局监听器,因此需要确保那里有一个观察者(我们的ActionListener) )目前为空。让我们实例化它这次,我们知道观察者不为空
public class UserInterface implements runnable{
private ActionListener observer new Observer();
//...
public void someMethodToCreateButtons(){
JRadioButton observableButton = new JRadioButton("Created here");
observableButton.addActionListener(observer);
}
就是这样,当您选择时observableButton,它将文本更改为“ this works”。
这些都是基础知识,现在,我使用了这些名称observableButton,Observer由于某种原因,ActionListeners是基于所谓的,observer design pattern您可以选择一本有关设计模式的书,您不会后悔。
最后,看来您使自己变得太难了,请尝试简化逻辑。也许制作JPanel包含不同按钮的集合并在条件为真时显示它?只是在这里吐口水,但请尽量保持简单,希望对您有所帮助,祝您好运!
添加回答
举报