如何使用Java swing进行此布局?

时间:2011-12-11 16:13:36

标签: java swing layout-manager

我有以下布局:

enter image description here

红色,蓝色和绿色部分是JPanel。在红色部分,我有四个JLabel。现在,如果我调整JFrame的大小,标题标签始终位于中心位置。但我更愿意,如果它们在红色部分均匀分布。我应该使用哪种布局?

7 个答案:

答案 0 :(得分:6)

使用GridLayout(1,0)作为顶级JPanel。这两个数字表示1行和可变数量的列。如果您使用的是JLabel,这就足够了,特别是如果将JLabels对齐常量设置为SwingConstants.CENTER。如果您使用的是填充网格插槽的组件,例如JButtons,那么您可能需要使用GridLayout构造函数的其他变体,例如GridLayout(1,0,?,0)。是一个数字告诉GridLayout插槽之间应该有多少水平间隔。

当然,整个GUI会使用BorderLayout。

如需更多更好的信息,请查看Lesson: Laying Out Components Within a ContainerA Visual Guide to Layout Managers

例如:

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

import javax.swing.*;

public class LayoutEg {

   private static void createAndShowGui() {
      String[] labelStrings = {"One", "Two", "Three", "Four"};
      JPanel topPanel = new JPanel(new GridLayout(1, 0));
      for (String labelString : labelStrings) {
         // create labels and center the text
         topPanel.add(new JLabel(labelString, SwingConstants.CENTER)); 
      }
      topPanel.setBackground(Color.red);

      JPanel centerPanel = new JPanel();
      centerPanel.setBackground(Color.blue);

      // setting preferred size for demonstration purposes only
      centerPanel.setPreferredSize(new Dimension(700, 400));

      JPanel bottomPanel = new JPanel();
      bottomPanel.setBackground(Color.green);

      // main panel uses BorderLayout
      JPanel mainPanel = new JPanel(new BorderLayout());
      mainPanel.add(centerPanel, BorderLayout.CENTER);
      mainPanel.add(topPanel, BorderLayout.PAGE_START);
      mainPanel.add(bottomPanel, BorderLayout.PAGE_END);


      JFrame frame = new JFrame("LayoutEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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

答案 1 :(得分:4)

对框架的内容窗格使用BorderLayout,并为标题面板使用1行和4列的GridLayout。

有关教程,请参阅http://docs.oracle.com/javase/tutorial/uiswing/layout/border.htmlhttp://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html

如果您不希望为每个标签分配相同的宽度,但实际上每个标签之间需要相同的空格,您也可以使用BoxLayout,并在每个标签之间(以及面板边框之间)添加胶水和标签:

p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Label"));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Long Label"));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Very long Label"));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Extremely long Label"));
p.add(Box.createHorizontalGlue());

答案 2 :(得分:3)

  • 使用BorderLayout作为主框架,并使用NORTHCENTERSOUTH个地方。
  • 要在底部面板中创建空白区域,请使用Box.createVerticalStrut(size)
  • 使用BoxLayout将标签打包成行。
  • 最后使用GridBagLayout将面板置于另一个面板中心。

这是一个简短的例子:

enter image description here

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

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Prototype extends JFrame {

    public Prototype() {

        JPanel labelPanel = new JPanel();
        labelPanel.setLayout(new BoxLayout(labelPanel, BoxLayout.LINE_AXIS));
        labelPanel.add(new JLabel("First"));
        labelPanel.add(Box.createHorizontalStrut(10));
        labelPanel.add(new JLabel("Second"));
        labelPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
        labelPanel.setOpaque(false);

        JPanel bottomPanel = new JPanel();
        bottomPanel.add(Box.createVerticalStrut(15));
        bottomPanel.setBackground(Color.GREEN);

        JPanel centerPanel = new JPanel();
        centerPanel.add(Box.createRigidArea(new Dimension(200, 300)));
        centerPanel.setBackground(Color.BLUE);

        JPanel northPanel = new JPanel(new GridBagLayout());
        northPanel.add(labelPanel);
        northPanel.setBackground(Color.RED);

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(northPanel, BorderLayout.NORTH);
        panel.add(centerPanel, BorderLayout.CENTER);
        panel.add(bottomPanel, BorderLayout.SOUTH);

        add(panel);
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new Prototype();
    }

}

答案 3 :(得分:2)

使用MigLayout

不,说真的,我曾经疯狂地尝试让Java布局正常工作。然后我开始维护一些使用MigLayouts的软件,大约一周后我可以做任何我想做的事情。有一个很好的cheat sheet看起来非常令人生畏,但它非常有帮助。

使用MigLayout,要在JPanel中均匀分布标签,您可以:

// the "fillx" means that the layout will expand to take up all available horizontal space
JPanel panel = new JPanel(new Miglayout("fillx"));

// the "growx" means that the component will expand to take up all available horizontal space
add(new JLabel("Work items"), "growx");
add(new JLabel("Change set"), "growx");
add(new JLabel("Files"), "growx");
add(new JLabel("Source code"), "growx");

答案 4 :(得分:1)

gridLayout,将标签放入网格布局并将行设置为1,将列设置为4(每个标签为1行)

http://www.javabeginner.com/java-swing/java-gridlayout-class-example

答案 5 :(得分:0)

GridBagLayout是一种方法。将weightx值设置为1.0。

答案 6 :(得分:0)

要使标签水平均匀分布 - 在红色面板中 - 使用带有X AXIS方向的BoxLayout并在每个标签之间加上“胶水” - 更多信息 -

http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html