2016-11-20 85 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

哦,我的評論同意你的回答。 –