为了账号安全,请及时绑定邮箱和手机立即绑定

将动作监听器连接到单选按钮时遇到麻烦

将动作监听器连接到单选按钮时遇到麻烦

ABOUTYOU 2021-04-06 13:10:53
我正在尝试创建个性测验。这个想法是,一个JPanel将显示第一个问题,然后,一旦用户选择了一个单选按钮,第二个JPanel将显示第二个问题。由于我有5个问题,每个问题有3个答案选项,因此我认为创建一个创建单选按钮并添加一个单选按钮的方法会更快,更高效,ActionListener但是我很难让听众开始工作。现在,看看它是否有效,我只是想在选择按钮文本时对其进行更改。我尝试将侦听器添加到createButton方法中的按钮,但没有运气。最初,我在方法中将其作为参数,但是没有得到预期的结果,因此我尝试在没有将侦听器作为参数的情况下创建它。插入侦听器作为参数不会更改文本。这是我的动作监听器public class ClickListener implements ActionListener {    private UserInterface ui;     private JRadioButton b;     @Override    public void actionPerformed(ActionEvent ae) {        if (b.isSelected()){            b.setText("this works");        }    }}实际结果是选择了按钮,但文本没有更改。我无法弄清楚是否运行了错误的测试以查看我的听众是否正常,或者我的听众是否不正常。
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

您的主要问题在这里:

private ActionListener listeners;

您创建了一个,ActionListener但从未调用它。

您还继承ClickListener但从未使用过它。

public class UserInterface extends ClickListener implements Runnable

在您的代码中,您调用:

b.addActionListener(listeners); //Listeners is null!

因此,您要告诉您JRadioButton有一个监听器,即null

因此,这里有两种方法:

  1. private ActionListener listeners;从程序顶部删除并更改:

    b.addActionListener(listeners);

    至:

    b.addActionListener(this);
  2. 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

并正确缩进您的代码:)


查看完整回答
反对 回复 2021-04-14
?
呼啦一阵风

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包含不同按钮的集合并在条件为真时显示它?只是在这里吐口水,但请尽量保持简单,希望对您有所帮助,祝您好运!


查看完整回答
反对 回复 2021-04-14
  • 3 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信