在EDT线程中,Swing JFrame组件未在框架中绘制,即框架为空,但框架成功在主线程中绘制

时间:2020-05-13 12:37:53

标签: java multithreading swing

当我处于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
            }
        });
   }
  }

0 个答案:

没有答案
相关问题