2016-04-25 17 views
1

里面一个JButton的actionPerformed方法,我有以下代码:如何使按钮更改repaint -during-方法,而不是之后?

btnLogin.setText("Logging In..."); 
btnLogin.setPreferredSize(new Dimension(110, 29)); 
btnLogin.setEnabled(false); 

//more stuff here, irrelevant to this 

这工作,但只需要视觉效果(被粉刷),一旦该方法完成。

如果在// more stuff这个区域中有我需要很长时间才能完成的代码,那么在代码完成之前,btnLogin更改的效果不会生效。

我已经试过打字:

this.revalidate(); 
this.repaint(); 

第3行,以及其他多种解决方案后直接,试图迫使该死的东西重新绘制方法的过程中,但不管是什么,它只是发生在结束!

我注意到的另一件事是,如果我在方法中间调用JOptionPane,框架将重绘(在后台),所以这很有趣。

什么是自动发生在方法的结尾,我需要调用以使其在方法期间发生?

在此先感谢!

回答

2

您使用长时间运行的代码阻止Swing事件线程,并且这可以防止Swing绘制文本更改。解决方案:

  • 在后台线程中执行长时间运行的代码,例如在SwingWorker的doInBackground方法中。
  • 但请务必在Swing事件线程上创建大部分Swing调用。
  • 阅读Concurrency in Swing教程,了解关于Swing事件线程和线程问题的详细信息。
+0

如何更改在Swing事件线程中发生的按钮属性更改行而不是在方法线程中? – Heaney

+0

@海尼:我解释了你需要做的上面。 –

+0

@Heaney:你已经**正在**调用Swing事件线程上的更改代码。你需要做的是从这个线程调用长时间运行的代码。 –

相关问题