Java:MigLayout Center不工作|绝对定位的替代方案

Java:MigLayout Center不工作|绝对定位的替代方案,java,swing,user-interface,miglayout,Java,Swing,User Interface,Miglayout,元素不会垂直居中,我不知道为什么。我试过“中心中心”,但不起作用。 混合布局 private JPanel panel = new JPanel(new MigLayout("center center, filly")); 组成部分 panel.add(header, "span"); panel.add(input, "split 4"); panel.add(unit1); panel.add(to); panel.add(unit2, "wrap"); panel.add(conve

元素不会垂直居中,我不知道为什么。我试过“中心中心”,但不起作用。

混合布局

private JPanel panel = new JPanel(new MigLayout("center center, filly"));
组成部分

panel.add(header, "span");
panel.add(input, "split 4");
panel.add(unit1);
panel.add(to);
panel.add(unit2, "wrap");
panel.add(convert, "span");
panel.add(output, "span");
我想将组件居中,但不是使用绝对定位(因为我知道如何使用此方法居中)

TL;DR

你真丢脸,但是

  • center-center
    不是
    center,center
  • center,center,filly
    -
    filly
    缓解垂直中心
  • 要对齐单个组件,您需要
    align center
    -例如,
    panel.add(新的JLabel(“标题”),“span,align center”)

假设您询问如何水平对齐组件,则需要指定每个组件。但是,首先最好看看下面这行代码的实际功能

private JPanel panel = new JPanel(new MigLayout("center center, filly"));
或者更具体地说,以下摘录的含义

new MigLayout("center center, filly")
center-center
-这将水平对齐
JPanel
上的打包组件

假设您试图使组件垂直和水平居中,实际上需要
center,center
。注意两个
中心
关键字之间的

filly
-引用白皮书“声明容器中所有可用的列和/或行空间”

这大大减轻了“中心,中心”的影响,您真正需要的是
center,filly


现在,要跨多列水平对齐组件,需要将关键字
align center
添加到每个要在其上执行此操作的组件。比如说

panel.add(new JLabel("Header"), "span, align center");
您的组件的一个例子是

String[] dummyList  = new String[] {
    "Val 1",
    "Val 2"
};
JPanel migPanel = new JPanel(new MigLayout("center, filly")); //Maybe you wanted center, center. I'm not sure
migPanel.add(new JLabel("Header"), "span, align center");
migPanel.add(new JTextField("Input"), "split 4");
migPanel.add(new JComboBox<String>(dummyList));
migPanel.add(new JLabel("To"), "span");
migPanel.add(new JComboBox<String>(dummyList), "wrap");
migPanel.add(new JButton("Convert"), "span, align center");
migPanel.add(new JTextField("Output"), "span, align center");

可运行示例-LayoutExample.java

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

import net.miginfocom.swing.MigLayout;

@SuppressWarnings("serial")
public class LayoutExample extends JFrame {
    private JTabbedPane tabs;
    private JPanel migPanel;
    private JPanel gridBagPanel;
    private JPanel migPanelCC;
    private JPanel gridBagPanelCC;
    private String[] dummyList  = new String[] {
        "Val 1",
        "Val 2"
    };

    private LayoutExample() {
        super("Layout Example");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setUpTabs();
        add(tabs);

        setSize(800, 500);
        setVisible(true);
    }

    private void setUpTabs() {
        tabs = new JTabbedPane();

        setUpMig();
        tabs.add(migPanel, "Mig Panel");

        setUpMigCC();
        tabs.add(migPanelCC, "Mig Panel Center Center");

        setUpGridBag();
        tabs.add(gridBagPanel, "Grid Bag Panel");

        setUpGridBagCC();
        tabs.add(gridBagPanelCC, "Grid Bag Panel Center Center");
    }

    private void setUpMig() {
        migPanel = new JPanel(new MigLayout("center, filly"));
        addToMigPanel(migPanel);
    }

    private void setUpMigCC() {
        migPanelCC = new JPanel(new MigLayout("center, center"));
        addToMigPanel(migPanelCC);
    }

    private void addToMigPanel(JPanel mPanel) {
        mPanel.add(new JLabel("Header"), "span, align center");
        mPanel.add(new JTextField("Input"), "split 4");
        mPanel.add(new JComboBox<String>(dummyList));
        mPanel.add(new JLabel("To"), "span");
        mPanel.add(new JComboBox<String>(dummyList), "wrap");
        mPanel.add(new JButton("Convert"), "span, align center");
        mPanel.add(new JTextField("Output"), "span, align center");
    }

    private void setUpGridBag() {
        gridBagPanel = new JPanel(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        gc.weighty = 1;
        addToGridBagPanel(gridBagPanel, gc);
    }

    private void setUpGridBagCC() {
        gridBagPanelCC = new JPanel(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        addToGridBagPanel(gridBagPanelCC, gc);
    }

    private void addToGridBagPanel(JPanel gblPanel, GridBagConstraints gc) {
        gc.gridwidth = 4;
        gblPanel.add(new JLabel("Header"), gc);

        gc.gridy = 1;
        gc.gridwidth = 1;
        gblPanel.add(new JTextField("Input"), gc);

        gc.gridx = 1;
        gblPanel.add(new JComboBox<String>(dummyList), gc);

        gc.gridx = 2;
        gblPanel.add(new JLabel("To"), gc);

        gc.gridx = 3;
        gblPanel.add(new JComboBox<String>(dummyList), gc);

        gc.gridy = 2;
        gc.gridx = 0;
        gc.gridwidth = 4;
        gblPanel.add(new JButton("Convert"), gc);

        gc.gridy = 3;
        gblPanel.add(new JTextField("Output"), gc);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new LayoutExample());
    }
}
导入java.awt.EventQueue;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入javax.swing.JButton;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JTabbedPane;
导入javax.swing.JTextField;
导入net.miginfocom.swing.MigLayout;
@抑制警告(“串行”)
公共类LayoutExample扩展了JFrame{
专用JTabbedPane选项卡;
私人杰帕内尔小组;
私人JPanel gridBagPanel;
私人JPanel MIGCC;
私人JPanel gridBagPanelCC;
私有字符串[]dummyList=新字符串[]{
“Val 1”,
“Val 2”
};
私有布局示例(){
超级(“布局示例”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setUpTabs();
添加(选项卡);
设置大小(800500);
setVisible(真);
}
私有void setUpTabs(){
tabs=新的JTabbedPane();
设置mig();
添加标签(Mig面板,“Mig面板”);
setUpMigCC();
添加标签(Mig面板CC,“Mig面板中心”);
setUpGridBag();
添加(网格袋面板,“网格袋面板”);
setUpGridBagCC();
添加标签(gridBagPanelCC,“网格包面板中心”);
}
私人文件{
migPanel=新的JPanel(新的migplayout(“中心,菲利”);
addToMigPanel(migPanel);
}
私有void setUpMigCC(){
migPanelCC=新的JPanel(新的MigLayout(“中心,中心”);
addToMigPanel(migPanelCC);
}
专用void addToMigPanel(JPanel mPanel){
mPanel.添加(新JLabel(“标题”),“跨距,对齐中心”);
添加(新的JTextField(“输入”),“拆分4”);
mPanel.add(新JComboBox(dummyList));
mPanel.添加(新的JLabel(“To”),“span”);
mPanel.add(新JComboBox(dummyList),“wrap”);
mPanel.add(新的JButton(“转换”),“跨距,对齐中心”);
mPanel.add(新的JTextField(“输出”),“跨距,对齐中心”);
}
私有void setUpGridBag(){
gridBagPanel=newJPanel(newGridBagLayout());
GridBagConstraints gc=新的GridBagConstraints();
gc.weighty=1;
addToGridBagPanel(gridBagPanel,gc);
}
私有void setUpGridBagCC(){
gridBagPanelCC=newJPanel(newGridBagLayout());
GridBagConstraints gc=新的GridBagConstraints();
addToGridBagPanel(gridBagPanelCC,gc);
}
私有void addToGridBagPanel(JPanel gblPanel、GridBagGC){
gc.gridwidth=4;
gblPanel.add(新的JLabel(“头”),gc);
gc.gridy=1;
gc.gridwidth=1;
gblPanel.add(新的JTextField(“输入”),gc);
gc.gridx=1;
add(新的JComboBox(dummyList),gc);
gc.gridx=2;
gblPanel.add(新的JLabel(“To”),gc);
gc.gridx=3;
add(新的JComboBox(dummyList),gc);
gc.gridy=2;
gc.gridx=0;
gc.gridwidth=4;
gblPanel.add(新的JButton(“转换”),gc);
gc.gridy=3;
gblPanel.add(新的JTextField(“输出”),gc);
}
公共静态void main(字符串[]args){
invokeLater(()->new LayoutExample());
}
}


最后,使用绝对定位是个坏主意。这是因为当容器更改大小时,容器中的组件不会自动调整。这在大多数情况下都不起作用,因为您可能会很快丢失重要的UI组件,或者可能会有大量额外的空白。

GridBagLayout
绝对定位不是一个好的选择。其他布局管理器(或更好的管理器)是。我不确定我们应该从“元素不会垂直居中”中理解什么。“元素”是什么意思?发布并添加所需的布局。
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

import net.miginfocom.swing.MigLayout;

@SuppressWarnings("serial")
public class LayoutExample extends JFrame {
    private JTabbedPane tabs;
    private JPanel migPanel;
    private JPanel gridBagPanel;
    private JPanel migPanelCC;
    private JPanel gridBagPanelCC;
    private String[] dummyList  = new String[] {
        "Val 1",
        "Val 2"
    };

    private LayoutExample() {
        super("Layout Example");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setUpTabs();
        add(tabs);

        setSize(800, 500);
        setVisible(true);
    }

    private void setUpTabs() {
        tabs = new JTabbedPane();

        setUpMig();
        tabs.add(migPanel, "Mig Panel");

        setUpMigCC();
        tabs.add(migPanelCC, "Mig Panel Center Center");

        setUpGridBag();
        tabs.add(gridBagPanel, "Grid Bag Panel");

        setUpGridBagCC();
        tabs.add(gridBagPanelCC, "Grid Bag Panel Center Center");
    }

    private void setUpMig() {
        migPanel = new JPanel(new MigLayout("center, filly"));
        addToMigPanel(migPanel);
    }

    private void setUpMigCC() {
        migPanelCC = new JPanel(new MigLayout("center, center"));
        addToMigPanel(migPanelCC);
    }

    private void addToMigPanel(JPanel mPanel) {
        mPanel.add(new JLabel("Header"), "span, align center");
        mPanel.add(new JTextField("Input"), "split 4");
        mPanel.add(new JComboBox<String>(dummyList));
        mPanel.add(new JLabel("To"), "span");
        mPanel.add(new JComboBox<String>(dummyList), "wrap");
        mPanel.add(new JButton("Convert"), "span, align center");
        mPanel.add(new JTextField("Output"), "span, align center");
    }

    private void setUpGridBag() {
        gridBagPanel = new JPanel(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        gc.weighty = 1;
        addToGridBagPanel(gridBagPanel, gc);
    }

    private void setUpGridBagCC() {
        gridBagPanelCC = new JPanel(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        addToGridBagPanel(gridBagPanelCC, gc);
    }

    private void addToGridBagPanel(JPanel gblPanel, GridBagConstraints gc) {
        gc.gridwidth = 4;
        gblPanel.add(new JLabel("Header"), gc);

        gc.gridy = 1;
        gc.gridwidth = 1;
        gblPanel.add(new JTextField("Input"), gc);

        gc.gridx = 1;
        gblPanel.add(new JComboBox<String>(dummyList), gc);

        gc.gridx = 2;
        gblPanel.add(new JLabel("To"), gc);

        gc.gridx = 3;
        gblPanel.add(new JComboBox<String>(dummyList), gc);

        gc.gridy = 2;
        gc.gridx = 0;
        gc.gridwidth = 4;
        gblPanel.add(new JButton("Convert"), gc);

        gc.gridy = 3;
        gblPanel.add(new JTextField("Output"), gc);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new LayoutExample());
    }
}