2014-04-22 190 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