gpt4 book ai didi

java - 为什么我对 ActionListener 的更改没有立即生效?

转载 作者:行者123 更新时间:2023-12-01 17:02:12 24 4
gpt4 key购买 nike

这是我的代码:

public MyClass() {
JButton btnNext;
private void initComponents() {
btnNext = new javax.swing.JButton();
btnNext.setText("Lanjut");
btnNext.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnNextActionPerformed(evt);
}
});
}

private void btnNextActionPerformed(java.awt.event.ActionEvent evt) {
btnNext.setText("Loading...");
callingFunction();
}
}

注意:callingFunction() 是一个需要很长时间执行的函数。

我的问题是,只有在调用Function() 完成后,我的按钮文本才会更改为“正在加载...”。

如何立即将 btnNext 文本更改为“正在加载...”?

最佳答案

在控制权返回到 Swing 事件队列之前,按钮不会被重新绘制。在事件调度线程上调用该函数会阻塞事件队列。

作为解决方法,告诉它稍后运行该函数(一旦完成重绘):

在 Java 8+ 中:

EventQueue.invokeLater(() -> callingFunction());

在旧 Java 中:

EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
callingFunction();
}
});

请注意,在该函数运行时,这仍然会产生阻止与 GUI 进一步交互的副作用。如果您想在后台线程中运行长任务以保持 GUI 交互,请使用 SwingWorker 。一个最小的示例,假设 callingFunction 返回一些您想要用来更新显示的 String 类型的结果(或其他类型):

new SwingWorker<String,Void>() {
@Override
protected String doInBackground() throws Exception {
// called on a background thread
return callingFunction();
}

@Override
protected void done() {
// called on the event dispatch thread after the work is done
String result;
try {
result = get();
} catch (Exception e) {
throw new RuntimeException(e);
}
// do something with the result ...
someTextField.setText(result);
}
}.execute();

关于java - 为什么我对 ActionListener 的更改没有立即生效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26957233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com