在这里解释我的问题是MCVE,点击JButton
A上的JDialog
点击JDialog
B:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
public class DiagA extends JDialog {
private DiagB diag;
public DiagA() {
super();
setTitle("main diag");
setSize(200, 150);
setLocation(400,400);
JButton btn = new JButton("Show DiagB");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
showDiag();
}
});
add(btn, BorderLayout.NORTH);
//make main frame visible
setVisible(true);
}
void showDiag() {
if(diag == null) {
diag = new DiagB();
//this prints out as expected
System.out.println("set visible done");
try {
Thread.sleep(3000);
} catch (InterruptedException ex) {}
//only after the delay diag shows in full
}
}
public static void main(String[] args) {
new DiagA();
}
}
class DiagB extends JDialog {
public DiagB() {
super();
setTitle("2nd diag");
setSize(150, 100);
setLocation(600,420);
setLayout(new FlowLayout(FlowLayout.CENTER));
getContentPane().setBackground(Color.YELLOW);
setVisible(true);
}
}
正如您在代码中看到的那样,我在创建DiagB
后添加了3秒的延迟。
点击按钮DiagB
会显示如下:
仅在3秒延迟结束后,DiagB
完整显示:
我的问题是:
一个。为什么DiagB
在构建之后没有完全显示出来? (仅在showDiag()
返回时才显示完整)。
湾我的问题的原因是DiagB
需要通过DiagA
中的长流程进行更新。
更新的正确方法是什么?是否需要在每个更新过程中使用SwingWorker
?
答案 0 :(得分:4)
一个。 SwingWorker
在GUI线程上运行。当你让GUI线程休眠时,GUI将完全死亡。
湾是的,使用SwingUtilities.invokeLater()
进行长时间运行的任务,并使用SwingWorker#done()
将GUI更新任务提交回GUI线程。或者,实现SwingWorker
,这是在<div class="form-group">
<label for="name" class="label-head">Company Name <sup><span
class="glyphicon glyphicon-asterisk red" aria-hidden="true"></span></sup></label>
<input type="text" class="form-control text-box-length input-lg" id="companyname" placeholder="Enter Your Company Name" data-validation="required" maxlength="50">
</div>
任务完成后在GUI线程上运行的便捷方法。
答案 1 :(得分:0)
根据Marko Topolnik的回答和Andrew Thompson的评论,我用Console.Writeline("The account's balance is: " + theAcc.Balance);
来扭曲漫长的过程。
这很好用:
SwingWorker