我正在尝试创建一个简单的类,用户可以通过单击按钮更改字符串测试的值,然后返回更改的字符串。
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为字符串赋值?如果没有,我该怎么做? 我可以实现某种延迟或其他类来获得我想要的结果吗?
答案 0 :(得分:0)
要回答您的问题 - 是的,您要将值分配给变量" test",但主线程并不等待您单击按钮。这就是它打印null的原因。您可以让主线程等到设置值,但这是使用Swing的错误方法。 Swing程序中有三种线程:
您可以在此处阅读更多内容:Lesson: Concurrency in Swing
但是,如果出于某些不太可能的原因,您确实需要访问"测试"从主(初始)线程变量,您可以实现具有锁定和条件的等待机制,如下所示:
WinSock2.h
在此处阅读有关锁和条件的更多信息: Lock Objects