【问题标题】:How to change variable value throughout outer class when it changed in an inner one?当内部类更改时,如何更改整个外部类的变量值?
【发布时间】:2013-09-01 18:01:27
【问题描述】:

我有一个 swing 类,其中包括一个声明为 final 的字符串变量 str3 和两个

两个JButtons b1实现的ActionListener接口

和b2,当b1 JButton被按下时str3字符串取值,

我的问题在这里如何使 str3 值在整个课程中更改

而是在第二个 ActionListener 接口中(不是只在第一个内部类中)。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;

public class mySwing extends JFrame {

    JButton b1, b2;

    public mySwing() {
        final String str3;
        JPanel panel = new JPanel();
        b1 = new JButton("please click me first");
        b2 = new JButton("please click me second");
        final JTextField txt = new JTextField("                            ");
        panel.add(txt);
        Container pane = getContentPane();
        panel.add(b1);
        panel.add(b2);
        pane.add(panel);
        str3 = new String();
        b1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent acv) {
                String input = "HelloWorld";
                String str3 = new String(input.substring(0, 5));
                txt.setText(str3);
            }
        });
        b2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent acv) {
                txt.setText(str3);
            }
        });
        setVisible(true);
    }

    public static void main(String[] args) {
        new mySwing();
    }
}

【问题讨论】:

    标签: java swing inner-classes anonymous-class outer-classes


    【解决方案1】:

    只需将str3 设为外部类mySwing 的非最终实例变量即可。

    顺便说一句,不要做new String(input.substring(0, 5))input.substring(0, 5)的结果之类的事情一个字符串,所以你不需要创建另一个字符串。

    根据您的代码:

    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.util.*;
    
    public class mySwing extends JFrame {
    
        JButton b1, b2;
        String str3="";
    
        public mySwing() {
            JPanel panel = new JPanel();
            b1 = new JButton("please click me first");
            b2 = new JButton("please click me second");
            final JTextField txt = new JTextField("                            ");
            panel.add(txt);
            Container pane = getContentPane();
            panel.add(b1);
            panel.add(b2);
            pane.add(panel);
            str3 = new String();
            b1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent acv) {
                    str3+=" (1)";
                    txt.setText(str3);
                }
            });
            b2.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent acv) {
                  str3+=" (2)";
                  txt.setText(str3);
                }
            });
            setVisible(true);
        }
    
        public static void main(String[] args) {
            new mySwing();
        }
    }
    

    【讨论】:

    • 不,它必须是 final 才能从内部类访问
    • 只有当它是一个局部变量时它才必须是最终的。创建实例变量时,内部类可以访问它而不是最终的。试试看。或者查看您的按钮b1b2。它们可以被你的内部类访问而不是最终的。
    • 请多解释我不明白你的想法
    【解决方案2】:

    您将变量 str3 声明为 final 的方法是正确的。然而,在 Java 中,字符串不能改变它们的内容,所以你必须做一些不同的事情。我能想到的一些想法:

    1. 改为使用 StringBuffer,并在需要时使用 toString() 方法将其转换为 String。
    2. 为您的 String 使用带有 getter 和 setter 的其他 POJO,这样 POJO 将被声明为 final,并且可以通过 getter 和 setter 更改内容。

    希望这有助于作为指导方针,当然还有许多其他好的方法。

    【讨论】:

    • 谢谢。这里的问题不是字符串成员而是更改变量值,所以我会尝试第二个选项
    【解决方案3】:

    你的变量 str3 是一个final,那么它永远不能改变。

    在您的代码中,您从未尝试更改它,您只是在 ActionListener 内部类中声明了一个新的 str3。

    【讨论】:

    • 看下面b2.addActionListener(new ActionListener() , 为什么str3的值为null(我想把它设为之前内部类中的值)
    • 最终字符串 str3;是您的“最终”声明,这意味着 str3 在程序运行期间永远不会改变,之后您已经初始化了您的 str3(str3 = new String()
    猜你喜欢
    • 2014-10-12
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多