2016-11-20 83 views
1

我得到了一个叫做PleaseWait的java类,并且想在任务繁重时调用它。当我的程序执行繁重的任务时,在我的actionListener的第一行中,我设置了这个类别的变量setVisible(true),然后在actionListener的末尾设置了setVisible(true)Java,Swing - JPanel没有像预期的那样出现在JFrame中

不知怎的,当我调用它的时候,这个类中的JPanel不会出现,它只是一个窗口,标题为set,空白为空白。这里是我的代码:

public class PleaseWait extends JFrame{ 

public PleaseWait(){ 

    Toolkit toolkit = Toolkit.getDefaultToolkit(); 

    Dimension screenDimensions = toolkit.getScreenSize(); 
    setSize(300,100); //set size based on screen size 
    setTitle("Please wait"); 
    Container container = getContentPane(); 
    setLocation(new Point(screenDimensions.width*1/4+200, screenDimensions.height*1/4+200)); //set location based on screen size 

    JPanel panel = new JPanel(); 
    JLabel wait = new JLabel("Please wait"); 
    Dimension buttonsSize = new Dimension(300,100); 
    panel.setPreferredSize(buttonsSize); 
    wait.setPreferredSize(buttonsSize); 
    panel.setLayout(new BorderLayout()); 
    panel.add(wait, BorderLayout.CENTER); 
    container.add(panel); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setResizable(false); //unresizable 
} 
+1

请[编辑]你的问题,包括实际的[MCVE](添加所有的代码)。 –

+0

这是我为这个班级所有的,其他班级只是打电话像'PleaseWait wait = new PleaseWait(); wait.setVisible(true);' –

+1

你是否按照链接阅读@JonnyHenly链接的文档?从你的答复,我怀疑不是。投票结束“无MCVE”(不仅有一个密切的理由,但实际上有两个提到它)。 –

回答

4

的关键不是在你发布的代码,但在这一行:

,并希望把它当一个沉重的任务正在进行中

您正在运行一个“繁重”任务,并且在运行它时,Swing不会绘制此GUI,因为您可能在Swing事件线程上运行了该任务,并且这样做会冻结线程和你的GUI

解决方案:使用后台线程(例如可通过SwingWorker获取)来运行“繁重”任务。

其他方的问题:

  • 这似乎是一个“依赖”或“子”的窗口关闭主应用程序的。如果是这样,它不应该是JFrame,因为应用程序应该只有一个主应用程序窗口,而应该是一个JDialog。
  • 您正在使用setPreferredSize(...)并对组件大小进行了硬编码,这些问题充满了问题。

例如,

import java.awt.*; 
import java.awt.Dialog.ModalityType; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 

import javax.swing.*; 

public class TestPleaseWait { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      MainPanel mainPanel = new MainPanel(); 
      JFrame frame = new JFrame("Application"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(mainPanel); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     }); 
    } 
} 

@SuppressWarnings("serial") 
class MainPanel extends JPanel { 
    private static final int PREF_W = 600; 
    private static final int PREF_H = 450; 

    public MainPanel() { 
     add(new JButton(new AbstractAction("Without Background Thread") { 
      { 
       putValue(MNEMONIC_KEY, KeyEvent.VK_O); 
      } 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       final PleaseWait wait = new PleaseWait(); 
       wait.setVisible(true); 
       try { 
        Thread.sleep(4000); 
       } catch (InterruptedException e1) { 
       } 
       wait.setVisible(false); 
      } 
     })); 
     add(new JButton(new AbstractAction("With Background Thread") { 
      private JDialog waitDialog = null; 
      private MyWaitPanel myWaitPanel = new MyWaitPanel(); 

      { 
       putValue(MNEMONIC_KEY, KeyEvent.VK_W); 
      } 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (waitDialog == null) { 
        Component component = MainPanel.this; 
        Window win = SwingUtilities.getWindowAncestor(component); 
        waitDialog = new JDialog(win, "Please Wait", ModalityType.APPLICATION_MODAL); 
        waitDialog.add(myWaitPanel); 
        waitDialog.pack(); 
        waitDialog.setLocationRelativeTo(win); 
       } 

       new Thread(() -> { 
        try { 
         Thread.sleep(4000); 
        } catch (InterruptedException e1) { 
        } 
        SwingUtilities.invokeLater(() -> { 
         waitDialog.setVisible(false); 
        }); 

       }).start(); 
       waitDialog.setVisible(true); 
      } 
     })); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 
} 

@SuppressWarnings("serial") 
class MyWaitPanel extends JPanel { 
    private JProgressBar progressBar = new JProgressBar(); 

    public MyWaitPanel() { 
     progressBar.setIndeterminate(true); 

     JLabel waitLabel = new JLabel("Please Wait", SwingConstants.CENTER); 
     waitLabel.setFont(waitLabel.getFont().deriveFont(Font.BOLD, 40)); 

     int ebGap = 10; 
     setBorder(BorderFactory.createEmptyBorder(ebGap, ebGap, ebGap, ebGap)); 
     setLayout(new BorderLayout(ebGap, ebGap)); 
     add(waitLabel, BorderLayout.PAGE_START); 
     add(progressBar); 
    } 
} 

@SuppressWarnings("serial") 
class PleaseWait extends JFrame { 

    public PleaseWait() { 

     Toolkit toolkit = Toolkit.getDefaultToolkit(); 

     Dimension screenDimensions = toolkit.getScreenSize(); 
     setSize(300, 100); // set size based on screen size 
     setTitle("Please wait"); 
     Container container = getContentPane(); 
     setLocation(new Point(screenDimensions.width * 1/4 + 200, 
       screenDimensions.height * 1/4 + 200)); 

     JPanel panel = new JPanel(); 
     JLabel wait = new JLabel("Please wait"); 
     Dimension buttonsSize = new Dimension(300, 100); 
     panel.setPreferredSize(buttonsSize); 
     wait.setPreferredSize(buttonsSize); 
     panel.setLayout(new BorderLayout()); 
     panel.add(wait, BorderLayout.CENTER); 
     container.add(panel); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); // unresizable 
    } 
} 
+0

我觉得这个问题与并发有关,或者缺乏这个问题。 –

+0

@JonnyHenly:将演示程序看作概念验证。 –

+0

哦,我的评论同意你的回答。 –