0

I have a swing class that includes a String variable str3 declared as final and two

ActionListener interfaces that implemented by two JButtons b1

and b2 , when b1 JButton is pressed str3 String takes a value ,

My question here how to make str3 value to be changed throughout the class

rather in the second ActionListener interface (not in the first inner class only ) .

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();
    }
}
4

3 回答 3

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();
    }
}
于 2013-08-29T11:03:35.037 回答
0

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

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

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

于 2013-08-29T10:58:34.003 回答
0

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

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

于 2013-08-29T11:30:55.230 回答