1

我有一个程序可以通过我在 main 中调用的函数来获取用户的输入。提交按钮附加了一个执行操作的方法。在删除输入文件并设置文本以通知用户后,我试图让它重新绘制屏幕。在使用自定义函数进行 try/catch 之后,它才会重新绘制。不知道我做错了什么,尽管它会按顺序执行?下面是附加到我的提交按钮的我的操作。一个注意事项是,如果我执行 frame.dispose() 或 setVisibility(false) 它将删除框架,任何帮助将不胜感激。谢谢!!

    button.addActionListener(new ActionListener (){

                public void actionPerformed(ActionEvent e) {
                    loc = FileLoc.getText();
                    name =  FileName.getText();

                    //inform user
                    area.setText("Attempting To Run Test....");
                    //backGroundPane contains the user input fields and button      
                    frame.remove(backGroundPane);
                    frame.repaint();

                    if(loc != null && name != null && 
                            !loc.equals("") && !name.equals(""))
                    {
                        try {
                            CallDrivers();
                        } catch (InterruptedException e1) {
                            System.out.println("Error Running Function");
                            //e1.printStackTrace();
                        }
                    }
                    else{
                        area.setText("There are Blank Fields");
                        System.out.println("test");
                    }
                }});
4

1 回答 1

3

您正在阻止 EDT(事件调度线程)。

事件分派线程负责分派所有 UI 事件,一次一个,按照发布的顺序。事件可以是:

  • 按键事件(例如用户按下按键)
  • 鼠标事件(例如用户移动鼠标)
  • 调用事件(您调用 SwingUtilities.invokeLater() 或JComponent.repaint()例如)
  • 绘制事件(绘制组件的请求)
  • 动作事件(由发生的 InputEvent 触发的逻辑事件)

当您调用重绘时,您正在将一个事件推送到队列中,但只要当前事件(actionPerformed 之一)未完成,就不会发生重绘。这就是为什么您的重绘仅在您的 try/catch 完成后发生

在这里阅读更多:http: //docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html

于 2012-10-30T14:18:32.780 回答