2014-04-22 228 views
2

我試圖創建這個基本的圖形用戶界面,但不能讓我的面板設置正確。(數字是像素大小)BorderLayout,GridLayout,GridBagLayout?我應該使用哪個?

GUI

我使用本教程爲基準(http://www.youtube.com/watch?v=Kl3klve_rmQ)嘗試,但,我的工作從不一樣。

我的代碼在類的頂部聲明瞭變量,然後創建了一個添加組件(面板,按鈕等)的構造函數,然後它調用main方法中的構造函數。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

公共類FinalProject擴展JPanel {

private static final long serialVersionUID = 1L; 

static JPanel nav; 
static JPanel queue; 
static JPanel menu; 

GridBagConstraints gbc = new GridBagConstraints(); 

public FinalProject() 
{ 

    nav = new JPanel(); 
    nav.setLayout(new GridBagLayout()); 
    nav.setBackground(Color.RED); 
    gbc.gridy = 0; 
    gbc.gridx = 0; 
    gbc.gridheight = 1; 
    gbc.gridwidth = 1; 
    add(nav, gbc); 

    queue = new JPanel(); 
    queue.setLayout(new GridBagLayout()); 
    queue.setBackground(Color.GREEN); 
    gbc.gridy = 1; 
    gbc.gridx = 1; 
    gbc.gridheight = 1; 
    gbc.gridwidth = 1; 
    add(queue, gbc); 

    menu = new JPanel(); 
    menu.setLayout(new GridBagLayout()); 
    menu.setBackground(Color.BLUE); 
    gbc.gridy = 2; 
    gbc.gridx = 2; 
    gbc.gridheight = 1; 
    gbc.gridwidth = 1; 
    add(menu, gbc); 
} 

public static void main(String[] args) 
{  
    FinalProject p = new FinalProject(); 
    JFrame f = new JFrame(); 

    f.add(nav); 
    f.add(queue); 
    f.add(menu); 

    f.setTitle("Subway"); 
    f.setSize(800, 500); 
    f.setLocationRelativeTo(null); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 
    f.setResizable(false); 
    f.add(p); 
} 

}

我應該怎樣去獲得這樣的佈局嗎?面板中的面板,相互獨立的面板等?

+3

我的建議是:主要是你需要的是一個BorderLayout的,但話說回來,我的主要建議是讓你嘗試一下,然後顯示代碼,如果你仍然有問題。否則,我們很難猜測你可能會做錯什麼。 –

+0

我已經發布了我的代碼:) – Michael

+0

您只添加一個按鈕...嘗試添加其他人,一個在NORTH,一個在中心。 –

回答

3

不,不要爲此使用GridBagLayout,因爲您將增加比實際需要更多的複雜性。我本人儘量避免使用這種佈局和所有潛在的陷阱,通常你可以通過嵌套JPanel獲得所有你需要的東西,每個都使用它自己的更簡單的佈局。例如在這裏,你需要的是一個BorderLayout的:

  • 放入BorderLayout.NORTH位置上的JPanel
  • 放入BorderLayout.WEST位置
  • 廣場中心的JPanel在BorderLayout的左側的JPanel .CENTER位置。

就是這樣。

請再次檢查出的搖擺和信息很好地體現有佈局管理器教程。


編輯
注意:並沒有顯示在您的JFrame,因爲你不加入你的JPanel到JFrame!


編輯2
例如:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridBagLayout; 

import javax.swing.*; 

public class SimpleLayout { 
    private static final Color GREEN = new Color(200, 255, 200); 
    private static final Color BLUE = new Color(200, 200, 255); 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("SimpleLayout"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // note that a JFrame's contentPane uses BorderLayout by default 
     frame.getContentPane().add(new ColorPanel(Color.pink, 800, 80), BorderLayout.NORTH); 
     frame.getContentPane().add(new ColorPanel(GREEN, 300, 420), BorderLayout.WEST); 
     frame.getContentPane().add(new ColorPanel(BLUE, 500, 420), BorderLayout.CENTER); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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

class ColorPanel extends JPanel { 
    private static final float FONT_POINTS = 24f; 
    private int prefW; 
    private int prefH; 

    public ColorPanel(Color color, int prefW, int prefH) { 
     setBackground(color); 
     this.prefW = prefW; 
     this.prefH = prefH; 

     // GBL can be useful for simply centering components 
     setLayout(new GridBagLayout()); 
     String text = String.format("%d x %d", prefW, prefH); 
     JLabel label = new JLabel(text, SwingConstants.CENTER); 
     label.setFont(label.getFont().deriveFont(FONT_POINTS)); 
     label.setForeground(Color.gray); 
     add(label); 
    } 



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

此爲顯示:

enter image description here

+0

我加了他們,但現在一切都是藍色的。我已經嘗試了這個borderlayout,但是使用gridbag我至少有東西出現。 – Michael

+0

@MikeMilla:例如,看到上面的代碼 –

+0

哇,謝謝。非常聰明的方式來獲得標籤名稱。 – Michael

2

GridLayout我從來沒有真正使用過,但我不確定它是否可以做到這一點。

BorderLayout可以做到這一點,比GridBagLayout更容易使用。

GridBagLayout可以做到這一點。

一般來說GridBagLayout是最靈活的LayoutManager之一,非常值得學習,所以我建議在這裏使用它來在一個簡單的情況下習慣它,然後再反正需要它來處理更復雜的事情。

如果您熟悉HTML,那麼將GridBagLayout視爲像HTML表一樣工作。

非常快 - 創建三個面板,並設置大小/邊界/無論你在他們需要什麼。

在小區0,0添加一個具有2 一個合併單元格添加一個細胞1,0 添加一個細胞1,1

在那之後你做,雖然你可能會想指定調整/錨/等行爲。

+0

我有點熟悉GridBagLayout和Constraints。任何想法,我如何能得到3面板符合我想要的適當約束的方式? css是'float:left',在gridbag中有類似的東西嗎? – Michael

+0

我會添加一個非常快速的摘要。 –

+0

我上面發佈了更新。沒有什麼東西顯示在我的框架上,我想我和我的gridx和網格設置很接近。 – Michael