如何使用MigLayout将内容放在多个面板上? [英] How to center content over several panels with MigLayout?

查看:145
本文介绍了如何使用MigLayout将内容放在多个面板上?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个大面板,其中包含3个较小的面板( locationPanel usagePanel structuralAspectsPanel )。

I have a large panel, that contains 3 smaller panels (locationPanel, usagePanel, structuralAspectsPanel).

每个较小的面板都有一些 JLabels JCheckBoxes 在他们身上。我继续将每个面板上的组件居中,但是如何在所有三个面板上将它们居中? (请参见中间的黑线)

Each of the smaller panels has some JLabels and JCheckBoxes on them. I went ahead and centered the components on each panel, but how can I accomplish the center them over all 3 panels? (see the black line in the center please)

我尝试在 MigLayout 中使用单元格布局选项( new JLabel( Label here), cell 0 0),但是无法动态创建相同大小的间隙,因此所有组件都居中。使用 gap 200 (180,300,...)将组件推到视觉中心似乎可行,但我要避免使用绝对定位/间隙,因为它们可能很容易损坏。

I have tried to use the cell-layout option in MigLayout (new JLabel("Label here"), "cell 0 0"), but was not able to create dynamically gaps of the same size, so that all components are centered. Using gap 200 (180, 300, ...) to "push" the components into a visual center seems to work, but I want to refrain from using absolute positioning / gaps, since they might break easily.

我附上了我的问题的照片:

I have attached a picture of my problem:

这是我的源代码:

public class RiskAssessmentPage extends JPanel {
  JPanel riskAssessmentPanel = new JPanel();

  JPanel locationPanel = new JPanel();
  JPanel usagePanel = new JPanel();
  JPanel structuralAspectsPanel = new JPanel();

  public RiskAssessmentPage() {
    setLayout(new MigLayout(""));
    riskAssessmentPanel.setLayout(
        new MigLayout("wrap", "[grow, fill]", "[grow, fill, push][grow, fill, push][grow, fill, push]"));

    locationPanel.setLayout(new MigLayout("gap rel 2", "[grow, center][grow, left]"));
    locationPanel.setBorder(BorderFactory.createTitledBorder("Location"));

    usagePanel.setLayout(new MigLayout("gap rel 2", "[grow, center][grow, left]"));
    usagePanel.setBorder(BorderFactory.createTitledBorder("Usage"));

    structuralAspectsPanel.setLayout(new MigLayout("gap rel 2", "[grow, center][grow, left]"));
    structuralAspectsPanel.setBorder(BorderFactory.createTitledBorder("Structural Aspects"));

    locationPanel.add(new JLabel("This is the first of all labels"));
    locationPanel.add(new JCheckBox("Checkbox with Label"), "wrap");
    locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    locationPanel.add(new JSeparator(), "growx, span");
    locationPanel.add(new JLabel("Second Label"));
    locationPanel.add(new JCheckBox("Checkbox with Label"), "wrap");
    locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    locationPanel.add(new JSeparator(), "growx, span");
    locationPanel.add(new JLabel("This Label is fairly large and long and pushes the text around"));
    locationPanel.add(new JCheckBox("Checkbox with Label"), "wrap");
    locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");

    usagePanel.add(new JLabel("A label in the usage panel"));
    usagePanel.add(new JCheckBox("Checkbox with Label"), "wrap");
    usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    usagePanel.add(new JSeparator(), "growx, span");
    usagePanel.add(new JLabel("And another one and another one and another one"));
    usagePanel.add(new JCheckBox("Checkbox with Label"), "wrap");
    usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");

    structuralAspectsPanel.add(new JLabel("Label here"));
    structuralAspectsPanel.add(new JCheckBox("Checkbox with Label"), "wrap");
    structuralAspectsPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    structuralAspectsPanel.add(new JSeparator(), "growx, span");
    structuralAspectsPanel.add(new JLabel("I am so uncreative with label names..."));
    structuralAspectsPanel.add(new JCheckBox("Checkbox with Label"), "wrap");
    structuralAspectsPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    structuralAspectsPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    structuralAspectsPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    structuralAspectsPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    structuralAspectsPanel.add(new JSeparator(), "growx, span");
    structuralAspectsPanel.add(new JLabel("Thats it. I give up with naming them."));
    structuralAspectsPanel.add(new JCheckBox("Checkbox with Label"), "wrap");
    structuralAspectsPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
    structuralAspectsPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");

    riskAssessmentPanel.add(locationPanel);
    riskAssessmentPanel.add(usagePanel);
    riskAssessmentPanel.add(structuralAspectsPanel);

    add(riskAssessmentPanel, "grow, push");
  }
}


推荐答案

在为了使面板列对齐,您需要将它们设置为相同大小。在 MigLayout 中,您可以通过将第一列的首选大小增长率设置为您在所有面板中的值都相同。例如

In order to make your panels columns line up, you need to set them to the same size. In MigLayout you can do this by setting, in this case, the first column's preferred size and growth rate to be the same value you in all the panels. For example

panel1.new MigLayout("", //Unchanged Layout Constraints
        "[:500, grow, center][grow, left]", //Column Constraints
        ""); //Unchanged Row Constraints

panel2.new MigLayout("", //Unchanged Layout Constraints
        "[:500, grow, center][grow, left]", //Column Constraints
        ""); //Unchanged Row Constraints

在此示例中,两个<$ c $的第一列的首选大小c> panel1 和 panel2 设置为500,并且增长设置为默认值,因此也相同。

In this example the preferred sizes of the first column of both panel1 and panel2 are set to 500 and the growth is set at its default value so that is also the same.

所描述内容的工作示例可以在此处查看

A working example of what is described can be seen here

import java.awt.*;
import javax.swing.*;
import net.miginfocom.swing.MigLayout;

public class MigLay extends JFrame {

    private MigLay() {
        super("Button Layout");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new MigLayout("wrap", //Layout Constraints
        "grow, fill", //Column Constraints
        "grow, fill")); //Row Constraints
        createPanels();
        pack();
        setMinimumSize(getSize()); //Sets minimum size to the preferred size. Remove or change this line if you do not want that to happen
        setVisible(true);
    }

    private void createPanels() {

        JPanel locationPanel = new JPanel();
        JPanel usagePanel = new JPanel();
        JPanel structuralAspectsPanel = new JPanel();

        //JLabels for font metrics
        JLabel one = new JLabel("This is the first of all labels");
        JLabel two = new JLabel("Second Label");
        JLabel three = new JLabel("This Label is fairly large and long and pushes the text around");
        JLabel four = new JLabel("A label in the usage panel");
        JLabel five = new JLabel("And another one and another one and another one");

        //Font Metrics
        FontMetrics metrics = three.getFontMetrics(three.getFont()); //Take longest label manually or dynamically (You will have to add that code)
        int width = metrics.stringWidth(three.getText());

        locationPanel.setLayout(new MigLayout("gap rel 2", "[:" + width + ", grow, center][grow, left]"));
        locationPanel.setBorder(BorderFactory.createTitledBorder("Location"));

        usagePanel.setLayout(new MigLayout("gap rel 2", "[:" + width + ", grow, center][grow, left]"));
        usagePanel.setBorder(BorderFactory.createTitledBorder("Usage"));

        locationPanel.add(one);
        locationPanel.add(new JCheckBox("Checkbox with Label"), "wrap");
        locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        locationPanel.add(new JSeparator(), "growx, span");
        locationPanel.add(two);
        locationPanel.add(new JCheckBox("Checkbox with Label"), "wrap");
        locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        locationPanel.add(new JSeparator(), "growx, span");
        locationPanel.add(three);
        locationPanel.add(new JCheckBox("Checkbox with Label"), "wrap");
        locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        locationPanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");

        usagePanel.add(four);
        usagePanel.add(new JCheckBox("Checkbox with Label"), "wrap");
        usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        usagePanel.add(new JSeparator(), "growx, span");
        usagePanel.add(five);
        usagePanel.add(new JCheckBox("Checkbox with Label"), "wrap");
        usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");
        usagePanel.add(new JCheckBox("Checkbox with Label"), "skip, wrap");

        getContentPane().add(locationPanel);
        getContentPane().add(usagePanel);
    }

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

这篇关于如何使用MigLayout将内容放在多个面板上?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆