actionPerformed后返回变量

时间:2016-03-10 15:00:53

标签: java actionlistener

我正在尝试创建一个简单的类,用户可以通过单击按钮更改字符串测试的值,然后返回更改的字符串。

public class TestTest
{
    private JFrame mainFrame;
    private JPanel panelX;
    private String test;

    public static void main(String[] args)
    {
        TestTest run = new TestTest();
        run.GUIinit();
        run.addButton();
        System.out.println(run.returnData());  // This returns null
    }

    // Method to return string value
    public String returnData()
    {
        return test;
    }

    // Method to set string value
    public void setData(String data)
    {
        test = data;
    }

    private void GUIinit()
    {
        mainFrame = new JFrame("Text");
        mainFrame.setSize(200, 200);
        mainFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent)
            {
                System.exit(0);
            }
        });
        panelX = new JPanel();
        mainFrame.add(panelX);
        mainFrame.setVisible(true);
    }

    // Problematic part
    private void addButton()
    {
        JButton testButton = new JButton("Text");
        panelX.add(testButton);
        testButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                setData("STRING BLABLA");
            }
        });
    }
}

我知道我正在做一些可怕的错误,但我无法理解, 我唯一的猜测是代码跳过println部分而不等待actionEvent。

我的问题是:当我点击按钮时,我是否使用actionEvent为字符串赋值?如果没有,我该怎么做? 我可以实现某种延迟或其他类来获得我想要的结果吗?

1 个答案:

答案 0 :(得分:0)

要回答您的问题 - 是的,您要将值分配给变量" test",但主线程并不等待您单击按钮。这就是它打印null的原因。您可以让主线程等到设置值,但这是使用Swing的错误方法。 Swing程序中有三种线程:

  • 初始线程,执行初始应用程序代码的线程。在你的情况下,这是运行main()方法的线程。
  • 事件调度线程(EDT),执行所有事件处理代码的线程。应该在该线程上执行所有程序逻辑(除非耗时)。在你的情况下,无论你需要做什么"测试"变量,你应该在这个线程上做。由于动作事件是在此线程上处理的,因此您应该在侦听器的actionPerformed()方法中执行此操作。
  • 工作线程。如果工作很耗时,您应该创建一个新线程并对其进行操作。即便如此,您应该从EDT(事件调度线程)启动它,而不是主(初始)线程。

您可以在此处阅读更多内容:Lesson: Concurrency in Swing

但是,如果出于某些不太可能的原因,您确实需要访问"测试"从主(初始)线程变量,您可以实现具有锁定和条件的等待机制,如下所示:

WinSock2.h

在此处阅读有关锁和条件的更多信息: Lock Objects