GUI JButton没有按时更新
问题描述:
我正在使用本质上是文件移动程序的代码。我试图做的是在用户点击调用文件移动器的提交按钮后,按钮的文本将变为“正在工作”。我有一个基本的理解,为什么它不工作时,我只是设置它,但我试图使用SwingUtilities在后台调用它。但是,在显示任何更改之前,它仍然等待方法调用ft.FindSpot完成之后。GUI JButton没有按时更新
public void actionPerformed(ActionEvent arg0) {
if(!textField.getText().equals(""))
{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
btnSubmit.setText("Working...");
}
});
//btnSubmit.setText("Working...");
ft.FindSpot(textField.getText(), comboBox.getSelectedItem().toString(), progressBar);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
btnSubmit.setText("Submit");
}
});
}
else
{
ft.warningMessage("The ISCII textbox cannot be blank.");
}
}
});
答
我设法解决了这个问题,将ft.FindSpot放在invokeLater Swing Utilities函数中,以便从不同的线程调用它。
btnSubmit.setFont(new Font("Verdana", Font.PLAIN, 12));
btnSubmit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if(!textField.getText().equals(""))
{
btnSubmit.setText("Working...");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ft.FindSpot(textField.getText(), comboBox.getSelectedItem().toString(), progressBar);
}
});
SwingUtilities.invokeLater(new Runnable() {
public void run() {
btnSubmit.setText("Submit");
}
});
}
else
{
ft.warningMessage("The ISCII textbox cannot be blank.");
}
}
});
使用[摇摆工人(https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html)做在后台线程漫长的过程。 [tutorial](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)显示了一个示例 – Frakcool
在Swing Events线程上调用了'actionPerformed()'方法。因此,第一个'btnSubmit.setText(“working ...”)'不需要用'invokeLater()'调用。但是'ft.FindSpot'也在Swing Events Thread上运行,基本上阻塞它直到完成,因此也不会发生按钮的视觉更新。 – cello
@MarshalAlessi这里是一个[示例](https://stackoverflow.com/questions/42256369/update-jlabel-text-after-opening-jdialog/42256976#42256976)它不是我的答案中的[mcve],但你可能需要问题的代码并在我提供的答案中使用我的建议。然而在这一刻,我无法提供一个示例,但可以在几个小时内尝试。 – Frakcool