按钮监控器给外部全局静态变量赋值后,如何向外输出这个赋值 System.out.println("new:" + strlast);输出始终是空;匿名类如何进参数值传到外面来

package newkecheng;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class TestButton extends JFrame implements ActionListener{
private static String str;
JButton jb,jb1;

public TestButton() {
    super();
    setTitle("按钮测试");
    setBounds(100, 100, 320, 200);
    setResizable(false);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    str ="";
    jb = new JButton("Crazy!");
    jb1 = new JButton("输出!");

    add(jb, BorderLayout.CENTER);
    add(jb1, BorderLayout.SOUTH);

    jb.addActionListener(this);
    jb1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO 自动生成的方法存根
            System.out.println(str);
        }

    });
}
class TestNew
{
    private String shuchu;

    public TestNew(String str) {
        shuchu = str;
    }

    public String getStr() {return shuchu;}
}

public static void main(String[] args) {
    TestButton tb = new TestButton() /**{
        public void actionPerformed(ActionEvent e) {
            // TODO 自动生成的方法存根
            str = str + e.getActionCommand();
            System.out.println(str);
        }
    }
    */;
    tb.setVisible(true);

    TestNew tn = tb.new TestNew(tb.str);


    String strlast = tn.getStr();

    System.out.println("new:" + strlast);

}

@Override
public void actionPerformed(ActionEvent e) {
    // TODO 自动生成的方法存根
    str = str + e.getActionCommand();
        System.out.println(str);
}

}

因为这个是在程序启动时,还没有给str赋值,初始化的时候str的是空字符串,所以System.out.println("new:" + strlast);输出始终是空。
java swing是基于事件驱动的,比如这块代码是给button按钮添加监听事件,

 jb.addActionListener(this);
    jb1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO 自动生成的方法存根
            System.out.println(str);
        }

    });

jb负责修改str的值,jb1负责将修改的值输出, 其中jb.addActionListener(this);this表示当前执行的对象,当点击时会执行如下代码:

@Override
public void actionPerformed(ActionEvent e) {
    // TODO 自动生成的方法存根
    str = str + e.getActionCommand();
        System.out.println(str);
}

有一种方法可以让外围的变量拿到这个值,将main方法修改如下,但是这样只能取到5秒内操作str的值:

public static void main(String[] args) throws InterruptedException {
    TestButton tb = new TestButton() /**{
        public void actionPerformed(ActionEvent e) {
            // TODO 自动生成的方法存根
            str = str + e.getActionCommand();
            System.out.println(str);
        }
    }
    */;
    tb.setVisible(true);

    Thread.sleep(5000L);
    TestNew tn = tb.new TestNew(tb.str);


    String strlast = tn.getStr();

     System.out.println("new:" + strlast);

}

https://blog.csdn.net/qq_39179888/article/details/98027520