BorderLayout,GridLayout,GridBagLayout?我应该使用哪个?

时间:2014-04-22 15:57:56

标签: java swing jframe jpanel

我正在尝试创建这个基本的GUI,但无法正确设置我的面板。(数字是像素大小)

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);
}

}

我应该如何正确地进行此布局?小组中的小组,小组彼此独立等等?

2 个答案:

答案 0 :(得分:4)

不,不要使用GridBagLayout,因为您将增加比实际需要更多的复杂性。我自己,尽量避免使用这种布局及其所有潜在的陷阱,通常你可以通过嵌套JPanel来获得所需的一切,每个都使用自己更简单的布局。例如,您只需要一个BorderLayout:

  • 将顶部JPanel放在BorderLayout.NORTH位置
  • 将左侧JPanel放置在BorderLayout.WEST位置
  • 将中心JPanel置于BorderLayout.CENTER位置。

那就是它。

再次,请查看Swing和布局管理器教程,因为信息很好地呈现在那里。


修改
请注意,您的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

答案 1 :(得分:2)

GridLayout我从未真正使用过,但我不确定它是否可以这样做。

BorderLayout可以执行此操作,并且比GridBagLayout更易于使用。

GridBagLayout可以做到这一点。

一般来说,GridBagLayout是最灵活的LayoutManager之一,非常值得学习,因此我建议您在此之前使用它来熟悉它,然后再根据需要进行操作无论如何,对于更复杂的事情。

如果您熟悉HTML,那么请将GridBagLayout视为像HTML表一样工作。

非常快 - 创建三个面板并设置尺寸/边框/您需要的任何内容。

在单元格0,0中添加一个colspan为2。 在单元格1,0中添加一个 在单元格1,1中添加一个

之后你就完成了,尽管你可能想要指定resize / anchor / etc行为。