我有一个程序,可以通过我在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");
                    }
                }});

最佳答案

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

事件分配线程负责按发布顺序一次分配所有UI事件。事件可以是:


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


当您调用重绘时,您将在队列上推送一个事件,但是只要当前事件(actionPerformed之一)未完成,就不会发生重绘。这就是为什么仅在尝试/捕获完成后才进行重新绘制的原因

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

10-08 13:48