我正在练习挥杆动作,并创建了一个等待用户输入的自定义对话框。
但是遇到一个奇怪的问题,我等不及了。
代码继续进行,它不等待文本插入。
现在我知道我应该使用JDialog并使用setModal方法,我找到了那个答案,但是我想知道为什么我的解决方案不起作用...
这是代码:
public class TextBox{
private static String inp=null;
private static boolean done=false;
private TextBox(){}//Dummy constructor to prevent instantiation
//Static function that will be called to generate dialog box
public static String getString(String str) {
String temp1=null;
JTextArea text=new JTextArea(); //Text area to accomdoate user input
JButton btn=new JButton("Enter");//Button whose click transfers text content to the inp variable
var frame=new JFrame(str); //frame that will contain txt area and button
frame.setVisible(true);
frame.setSize(200, 200);
frame.setDefaultCloseOperation(frame.DISPOSE_ON_CLOSE);
ActionListener act=(arg0)->{ //button action
inp=text.getText();
frame.dispose();
done=true;
};
btn.addActionListener(act);
frame.add(btn,BorderLayout.SOUTH);
frame.add(new JScrollPane(text),BorderLayout.CENTER);
//loop to make dialog box wait otherwise the function will return null
//before the button click fills inp with text content
while(!done) {
//System.err.println(done);
}
done=false;
temp1=inp;
inp=null;
return temp1;
}
}
我有一个布尔变量,当单击按钮时会被更改
因此,当对话框完成工作后,无限循环将结束。问题在于,显然,该变量不会更改,因此即使单击该按钮,循环也永远不会结束。
奇怪的是,如果我取消注释循环中的println
该代码可以按预期工作,并且布尔变量也发生了变化,并且我重新获得了我编写的字符串。
所以基本上我现在有两个问题:
1)是否会发生这种情况,因为没有println的jvm会因为无用而跳过循环吗?
2)为什么如果我将字符串变量设置为局部变量(而不是静态实例变量),则动作侦听器中的inp引用会给我错误,指出inp应该是最终变量?
提前致谢。
编辑:回答了第一个问题,我使布尔变量为volatile,现在可以使用了。但是我仍然不知道第二个问题的答案。
EDIT2:谢谢!