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