java - 如何在方法期间而不是之后进行按钮更改重绘?

标签 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 区域中我有需要很长时间才能完成的代码,则 btnLogin 更改的效果在该代码完成之前不会生效。

我尝试输入:

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

直接在前 3 行和多个其他解决方案之后,尝试强制该该死的东西在方法期间重新绘制,但无论如何,它只发生在最后!

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

在方法结束时自动发生的事情是什么,我需要调用它才能在方法期间发生?

提前致谢!

最佳答案

您使用长时间运行的代码阻塞了 Swing 事件线程,这会阻止 Swing 绘制文本更改。解决办法:

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

关于java - 如何在方法期间而不是之后进行按钮更改重绘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831401/

相关文章:

java - 用于缓存的 Netflix Zuul 前置过滤器不适用于少量压缩响应

java - 如何使用 Azure DevOps 发布管道将 Java 应用程序部署到 Tomcat 8 App Service?

java - 从另一个类调用方法时出现 NullPointerException

java - JFrame 显示其自身内部内容的副本...?

java - 有没有办法调试为什么我的 JavaFX-Project 的可执行 JAR 在我的计算机上运行而不是在其他计算机上运行? (使用jdk 1.8._051)

java - std::strtoull 在我的 JNI NDK 环境下无法识别

java - 如何根据Java中的组合框选项设置文本字段值?

java - JFrame:如何禁用窗口大小调整?

java - 如何在主线程仍在运行时使用线程运行另一个 JFrame

java - 如何在第二个窗口中更新 jFrame?