当我处于EDT线程中并检查SwingUtilities.isEventDispatchThread()时,我试图使用JFrame显示一个摆动对话框。在主线程中时,可以通过SwingUtilities.invokeLater()方法正确绘制组件,但在EDT线程中时,不会显示添加到框架中的组件。下面是代码:
private void showDialog(String title) {
frame = new JFrame();
frame.setTitle(title);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
JButton cancelLogin = new JButton("cancel login");
cancelLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
fireLoginCanceledEvent();
disposeFrame();
}
});
JPanel bottomPanel = new JPanel();
bottomPanel.add(cancelLogin);
panel.add(bottomPanel, BorderLayout.SOUTH);
JLabel info = new JLabel("login initiated...");
panel.add(info, BorderLayout.NORTH);
frame.getContentPane().add(panel);
frame.setLocationRelativeTo(null);
frame.setSize(300, 100);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
private synchronized void disposeFrame() {
if (frame != null) {
if (frame.isDisplayable()) {
frame.dispose();
}
public void display() {
if (SwingUtilities.isEventDispatchThread()) {
showDialog(windowTitle); // Components not appearing
frame.revalidate();
frame.repaint();
} else {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
showDialog(windowTitle); // Components are correctly rendered
}
});
}
}