我有一个程序,通过我在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");
}
}});
答案 0 :(得分:3)
您正在阻止EDT(事件派发线程)。
事件调度线程负责按照已发布的顺序一次调度所有UI事件。事件可以是:
JComponent.repaint()
)当您调用重绘时,您正在队列中推送一个事件,但只要当前事件(actionPerformed之一)未完成,就不会发生重绘。这就是您的重绘仅在try / catch完成后发生的原因
在此处阅读更多内容:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html