2013-12-18 55 views
4

我想知道如何使用GridLayout嵌套JPanel。這應該是這樣的。Java:如何在GridLayout中嵌套JPanel?

enter image description here

我通過2種方式走近這個問題到目前爲止,

  • 使用JPanel S和
  • 使用JLabel S,

,並沒有一次成功(只有顯示第一個面板)。

下面是JPanel方法的代碼:你必須是該圖像不縮放

int x=20, y=20; 
    JPanel [] panels = new JPanel[3]; 
    JLabel animal = new JLabel(new ImageIcon(getClass().getResource("Pictures/animal.gif"))); 
    JLabel map = new JLabel(new ImageIcon(getClass().getResource("Pictures/map.gif"))); 
    JLabel mountain = new JLabel(new ImageIcon(getClass().getResource("Pictures/mountain.gif"))); 

    for(int i=0;i<panels.length;i++) 
    { 
     if(i>0) 
     { 
      x+=x; 
      y+=y; 
     } 
     panels[i] = new JPanel(new GridLayout(2,2)); 
     panels[i].setPreferredSize(new Dimension(x,y)); 

     if(i==0) 
      panels[i].add(new JPanel()); 

     else 
      panels[i].add(panels[i-1]); 

     panels[i].add(mountain); 
     panels[i].add(map); 
     panels[i].add(animal); 
    }  
    add(panels[2]); 
+1

什麼是目前顯示? – fdsa

+1

https://www.dropbox.com/s/ub3n8nih5nivfm3/Screenshot%202013-12-18%2019.15.21.png – HishamGarout

+0

我只添加了最後一個JPanel,因爲我認爲其他面板被添加到它... – HishamGarout

回答

2

一種選擇是創建一個類,該類將表示與圖像分成網格的面板。唯一的問題將是通常包含嵌套面板的左上象限,在某些時候,你希望它只包含一個空白麪板。因此,也許這樣的事情(不包括各種優化):

class GridPanel extends JPanel{ 

    JLabel mountain, map, animal; 

    public GridPanel(JPanel panel){ 
     super(); 
     setLayout(new GridLayout(2, 2)); 
     animal = new JLabel(new ImageIcon(getClass().getResource("pictures/animal.gif"))); 
     map = new JLabel(new ImageIcon(getClass().getResource("pictures/map.gif"))); 
     mountain = new JLabel(new ImageIcon(getClass().getResource("pictures/mountain.gif"))); 
     add(panel); 
     add(mountain); 
     add(map); 
     add(animal); 
    } 

} 

注意,它接受的是要顯示在網格中的左上角的面板。這個coud然後被指定的面板調用。所以在你想創建主面板的地方:

JPanel grid = new GridPanel(new JPanel()); //initial 
    for(int i = 1; i <= 5; i++){ 
     grid = new GridPanel(grid); 
    } 
    add(grid); 

初始網格是用空白的JPanel創建的。並且每個後續網格都將包含前一個網格作爲左上方的面板。你必須調整你的圖像等,甚至可能避免多次加載圖像等,但這是另一個問題。這個例子顯示了5個嵌套面板。

要明確一點,您應該使用ImageIO加載一次圖像並重新使用圖像。例如,你可以在你的主類創建這樣一個BufferedImage:

BufferedImage mointainImg = ImageIO.read(new File("pictures/mountain.gif")); 

而且當你要創建一個JLabel,你可以這樣做:

mountain = new JLabel(new ImageIcon(mountainImg)); 

而且好處是,你可以操縱如果你想要一點圖像。

+0

非常感謝你 :) – HishamGarout

1

的一個問題。要縮放圖像,請使用Image.getScaledInstance()。適當的縮放至少可以解決可見圖像被切斷的問題。這也可能導致其他圖像被顯示,因爲它們可能隱藏在可見圖像後面,因爲它們太大。