ianwu007 2020-04-16 09:08 采纳率: 0%
浏览 237
已结题

按钮监控器给外部全局静态变量赋值后,如何向外输出这个赋值 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);
}

}

  • 写回答

2条回答 默认 最新

  • shy078 2020-04-16 09:37
    关注

    因为这个是在程序启动时,还没有给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);
    
    }
    
    评论

报告相同问题?