Java 如何在重绘期间而不是之后更改按钮?

Java 如何在重绘期间而不是之后更改按钮?,java,swing,jframe,jbutton,repaint,Java,Swing,Jframe,Jbutton,Repaint,在jButton的actionPerformed方法中,我有以下代码: btnLogin.setText("Logging In..."); btnLogin.setPreferredSize(new Dimension(110, 29)); btnLogin.setEnabled(false); //more stuff here, irrelevant to this 这是可行的,但是它只会在方法完成后产生视觉效果(重新绘制) 如果在//more stuff here区域我有需要很长时间

在jButton的actionPerformed方法中,我有以下代码:

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

//more stuff here, irrelevant to this
这是可行的,但是它只会在方法完成后产生视觉效果(重新绘制)

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

我试过打字:

this.revalidate();
this.repaint(); 
直接在前3行之后,以及多个其他解决方案,尝试在方法期间强迫该死的东西重新绘制,但不管怎样,它只会在最后发生

我注意到的另一点是,如果在方法中间调用joptPANE,框架将重新绘制(背景),这很有趣。

什么是在方法的末尾自动发生的,我需要调用它以使其在方法中发生


提前谢谢

您正在用长时间运行的代码阻塞Swing事件线程,这会阻止Swing绘制文本更改。解决方案:

  • 在后台线程中执行长时间运行的代码,例如SwingWorker的doInBackground方法
  • 但是请确保在Swing事件线程上进行大多数Swing调用
  • 阅读本教程以了解有关Swing事件线程和线程问题的详细信息

如何更改按钮属性更改行,使其出现在Swing事件线程中而不是方法线程中?@Heaney:我在上面解释了您需要执行的操作。@Heaney:您已经在Swing事件线程上调用了更改代码。您需要做的是调用这个线程中的长时间运行的代码。啊,这是我的困惑,我不知道ActionPerformed是在Swing事件线程中执行的。@Heaney:很高兴它能工作。我不知道你的意思,但我相信你会明白的。