package Chapter10;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class DialogTest extends JFrame {
public DialogTest(){
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(400,300);
JPanel panel = new JPanel();
JButton button = new JButton("MyJDialog");
button.addActionListener(e -> {
new MyJDialog(DialogTest.this, "Test", false).setVisible(true);
try{
Thread.sleep(3000);
}catch (InterruptedException ex){
}
System.out.println("button's actionListener runs in thread: "+Thread.currentThread());
});
panel.add(button);
add(panel);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(DialogTest::new);
}
}
class MyJDialog extends JDialog{
public MyJDialog(JFrame parent, String title, boolean modality){
super(parent,title,modality);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
add(new JLabel("<html><h1><i>Bob</i></h1><hr>By Liao Maosheng</html>"),BorderLayout.CENTER);
System.out.println("JDialog runs in thread: "+Thread.currentThread());
JButton ok = new JButton();
ok.setText("OK");
ok.addActionListener(e -> {
// setVisible(false);
dispose();
});
add(ok,BorderLayout.SOUTH);
setSize(200,200);
}
}
这里我发现 MyJDialogTest 也是运行在事件派遣线程里,设置了 modality 为 false,那么这里 MyDialogTest.setVisible()好像是立马返回了的,然后立刻开始延时,导致事件派遣队列不能更新 MyJDialogTest,所以这里的 setVisible 应该是异步调用吧?同一个线程里也能异步调用吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.