JFrame

时间:2018-11-26 20:23:12

标签: java swing jframe

我正在练习挥杆动作,并创建了一个等待用户输入的自定义对话框。
但是遇到一个奇怪的问题,我等不及了。
代码继续进行,它不等待文本插入。
现在我知道我应该使用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:谢谢!

0 个答案:

没有答案