在try / catch完成之后,JFrame将不会重新绘制

时间:2012-10-30 14:16:58

标签: java swing jframe

我有一个程序,通过我在main中调用的函数,通过swing来获取用户的输入。提交按钮附加了一个动作执行方法。在删除输入文件并设置文本以通知用户后,我试图让它重新绘制屏幕。它直到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");
                    }
                }});

1 个答案:

答案 0 :(得分:3)

您正在阻止EDT(事件派发线程)。

事件调度线程负责按照已发布的顺序一次调度所有UI事件。事件可以是:

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

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

在此处阅读更多内容:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html