【问题标题】:using .setText on final JRadioButton在最终的 JRadioButton 上使用 .setText
【发布时间】:2015-02-23 18:44:34
【问题描述】:

当 JRadioButton 设置为 final 时,如何更改其标签?

这是初始化单选按钮的构造函数中的一段代码,当按下复选按钮时,所选单选按钮的值被发送到验证用户答案的​​方法:

final JRadioButton ANSWER1 = new JRadioButton("Empty 1");
final JRadioButton ANSWER2 = new JRadioButton("Empty 2");
final JRadioButton ANSWER3 = new JRadioButton("Empty 3");
final JRadioButton ANSWER4 = new JRadioButton("Empty 4");

JButton CHECK = new JButton("Check");
CHECK.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        if (ANSWER1.isSelected()){
            qAnswered(1);
        }
        if (ANSWER2.isSelected()){
            qAnswered(2);
        }
        if (ANSWER3.isSelected()){
            qAnswered(3);
        }
        if (ANSWER4.isSelected()){
            qAnswered(4);
        }

    }   

});

选择下一个问题按钮时,无线电按钮的文本标签需要更改为下一组答案。不幸的是,由于单选按钮设置为 final,这会导致应用程序崩溃。

我该如何继续?

【问题讨论】:

    标签: java jradiobutton


    【解决方案1】:

    变量的final 关键字意味着该变量只能初始化一次,但这并不意味着该对象中的字段不能更改。即使JRadioButton 引用是finalANSWER4.setText() 也不会抛出任何最终相关的错误。

    if (ANSWER1.isSelected()){
        qAnswered(1);
        ANSWER1.setText("New Text 1"); // This will work
    }
    

    为了更清楚地了解final 变量,来自JLS 4.12.4(强调我的)

    变量可以声明为final。最终变量只能分配一次。声明一个变量 final 可以作为有用的文档,说明它的值不会改变,并且可以帮助避免编程错误。

    如果最终变量被分配给它是一个编译时错误,除非它在分配之前被明确地未分配(第 16 节)。

    一个空白的final是一个final变量,它的声明缺少一个初始化器。

    一旦分配了最终变量,它总是包含相同的值。如果最终变量持有对对象的引用,那么对象的状态可能会通过对对象的操作而改变,但变量将始终引用同一个对象。

    【讨论】:

    • 感谢您的回复。我们实际上得到了一个空指针异常“当 ANSWER1.setText("blah blah...");"叫做。你能帮忙解决这个问题吗?
    • 我不明白为什么它应该抛出 NPE,除非在执行 ANSWER1.setText() 时没有初始化 JRadioButton
    • 我们也不知道,只要调用包含 ANSWER1.setText 的 nextQuestion() 方法就会发生这种情况...
    • 可能你在nextQuestion()方法中访问的ANSWER1没有初始化?
    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多