2014-04-12 27 views
2

不知道我是否犯了一個菜鳥錯誤,但在爲我的JFrame中的JPanel創建GridLayout時更改行參數似乎導致另一個JPanel完全消失:奇怪的擺動錯誤:設置GridLayout參數讓我的JPanel消失

下面的代碼的精簡版:

  • 在GridBug構造設置我的佈局,並把一個子類的JPanel的BorderLayout.CENTER。這在我的原始代碼中做了其他的東西,但是這裏只是繪製一個框來顯示它正在顯示。
  • 不知何故被添加到BorderLayout.PAGE_END底部面板的狀態使所述中心面板消失
  • 特別地,改變GridLayout的行參數爲較高的值,通過中央面板消失,較低的值工作得很好
  • 的代碼,因爲它現在是,沒有我的電腦上工作,如果我去掉一些代碼,以減少行參數,或者如果我不加選擇JLabel或子面板,然後它工作...

我不知道我在做什麼錯:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GridLayout; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class GridBug extends JFrame{ 

    static class ImagePanel extends JPanel{ 

     @Override 
     public Dimension getPreferredSize(){ 
      return new Dimension(200,200); 
     } 

     @Override 
     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      System.out.println("Painting image panel..."); 
      g.setColor(Color.CYAN); 
      g.fillRect(0, 0, getWidth(), getHeight()); 
     } 
    } 

    public GridBug() { 

     setLayout(new BorderLayout()); 

     /*PROBLEM CODE HERE*/ 

     //add center image panel - does not appear depending on GridLayout settings in other panels 
     ImagePanel centerPanel = new ImagePanel(); 
     add(centerPanel , BorderLayout.CENTER); 

     //add bottom panel 
     JPanel bottomPanel = new JPanel(); 
     add(bottomPanel, BorderLayout.PAGE_END); 
     bottomPanel.setLayout(new GridLayout(6,0)); //doesn't work 
//    bottomPanel.setLayout(new GridLayout(5,0)); //works 

     JPanel subPanel = new JPanel(); 

     //if I pass more than 4 or so rows as param to gridlayout, 
     //then imagePanel is not displayed 
     subPanel.setLayout(new GridLayout(4,0)); //doesn't work 
//    subPanel.setLayout(new GridLayout(3, 0)); //works 


     //if I don't add this label - works 
     JLabel label = new JLabel("A Label:"); 
     subPanel.add(label); 

     bottomPanel.add(subPanel); //if I don't add the subPanel it works fine 

     /*END OF PROBLEM CODE?*/ 

     //set window params 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(400,400); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static final void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new GridBug(); 
      } 
     }); 
    } 
} 

回答

3

不確定你想要的確切結果,所以我甚至沒有嘗試。但是你面臨的問題是其中一個原因,你想要pack()你的框架,而不是setSize()。您正在收縮組件的首選大小。 pack()尊重所有組件的首選大小,並應使用,而不是setSize()

bottomPanel.setLayout(new GridLayout(6,0)); //doesn't work.. 
              // with pack(), now it does. 
pack(); 
//setSize(400,400); // if you increase the size it'll work also, but just pack() 

你只需要在鋪設出你的組件的工作現在得到您想要的樣子:)


更詳細的解釋你的問題。

enter image description here

這是你目前如何代碼看起來當我設置的背景。注意:您已經可以看到setSize()正在對頂部面板的首選尺寸(200,200)產生影響。

  • 頂部CYAN是您的圖像面板。
  • 藍色是subPanel與4行。使用GridLayout,所有行將至少是其最大組件的大小。在這種情況下,它是標籤。您可以看到藍色區域是標籤高度的4倍(因爲它應該是)
  • 不是RED,它是bottomPanel。這有5行。最大的組件是subPanel,因此bottomPanel的總大小是subPanel x 5的大小,如您所見。一旦添加了另一行,頂部面板就會被推出。
+0

謝謝!我從來沒有正常使用setSize(),忘了我這次設置了它。我不敢相信我花了很多時間來測試大量其他代碼,認爲這是一個完全不同的問題,只是單獨留下了這一行。 – mallardz