2012-09-20 234 views
0

我正在嘗試做以下操作,但我不確定要使用哪種類型的Java佈局。簡單的GUI Java佈局問題

我想要一個JFrame與單個面板totalPaneltotalPanel應該包含我寫的自定義類的兩個面板,PanelA和PanelB。 PanelA從高度200開始,PanelB從高度400開始。當用戶擴大窗口或調整窗口大小時,只有PanelB應該增加高度,但兩個面板的寬度都可以增加。

我該如何設置?我試過使用BorderLayout,但是「North」的高度總是太小。我試過使用BoxLayout,但後來PanelAPanelB總是一樣的高度。

+0

你可以發表一個[SSCCE](http://www.sscce.org)來說明你所嘗試過的嗎? –

+1

你試過GridBag嗎? http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html –

回答

4

考慮讓totalPanel使用BorderLayout。將PanelA添加到BorderLayout.PAGE_START位置,將PanelB添加到BorderLayout.CENTER位置。

欲瞭解更多的佈局管理器,請查看教程:Lesson: Laying Out Components Within a Container

編輯:我看到你使用的BorderLayout,它「不工作」,但你不顯示的代碼。爲了更好地調整它爲什麼不起作用,請考慮向我們展示代碼。

爲了讓它工作,考慮給你的PanelX類getPreferredSize()覆蓋,這將有助於設置JPanel的初始大小。

例如:

import java.awt.BorderLayout; 
import java.awt.Dimension; 

import javax.swing.*; 

public class SimpleGuiLayout { 

    private static void createAndShowGui() { 
     JPanel totalPanel = new JPanel(new BorderLayout()); 

     totalPanel.add(new PanelX(800, 200, "Panel A"), BorderLayout.PAGE_START); 
     totalPanel.add(new PanelX(800, 400, "Panel B"), BorderLayout.CENTER); 
     JFrame frame = new JFrame("Simple Gui Layout"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(totalPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

class PanelX extends JPanel { 
    private int prefW; 
    private int prefH; 

    public PanelX(int prefW, int prefH, String title) { 
     this.prefW = prefW; 
     this.prefH = prefH; 
     setBorder(BorderFactory.createTitledBorder(title)); 
    } 

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

如果運行,它看起來像這樣:
enter image description here

,並會適當地調整。

3

一種方法(可能不是最簡單的)就是GridBagLayout。

使用weightx和weighty約束來控制哪些成員可以調整大小。

3

我推薦一個GridBagLayout。使用起來很複雜,但它可以解決您的問題。假設紅砂糖是panelB的頂部,您將有以下限制:

  • 紅砂糖和panelB的是gridx是0
  • 紅砂糖將廣告gridy 0,panelB在gridy 1
  • 兩個,你將設置填充= BOTH
  • ,但有身高只有panelB的增加,你會設置panelB的分量爲1.0,紅砂糖的0
0

您最初使用的BorderLayout已經將工作的解決方案,您只需要設置紅砂糖的優選高度:

panelA.setPreferredSize(new Dimension(0, 200)); 

寬度並不重要,因爲BorderLayout的將忽略加入到北或南組分的優選寬度。