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