java - 当只使用一个单元格时,如何在 Miglayout 中强制每行 4 个单元格且宽度相等?

标签 java swing layout-manager miglayout

我有一个动态宽度的面板。添加到面板的组件应从左到右排列,每行最多 4 个组件(单元格),其中每个组件/单元格占面板宽度的 25%。如果只有一个组件,它应该填充父级宽度的 25% - 其余 75%(3 个单元格)的空间应该是空的。

我使用 hack 让它工作,但我对这种实现不满意 - 使用单元格并为每个未使用的单元格创建一个“空”面板。请参阅下面的代码片段:

MigLayout migLayout = new MigLayout("fillx, insets 0, wrap 4", "", "");
JPanel panel = new JPanel(migLayout);
JLabel label1 = new JLabel("1");
JLabel label2 = new JLabel("2");
JPanel filler1 = new JPanel();
JPanel filler2 = new JPanel();
panel.add(label1, "cell 0 0);
panel.add(label2, "cell 1 0);
panel.add(filler1, "cell 2 0);
panel.add(filler2 , "cell 3 0);

这给出了一些可以如下图所示的东西,其中外括号是外面板,两个内括号是标签:

[  [ 1 ]  [ 2 ]                ]

我希望它可以设置约束,而不是使用填充符,如下所示:

MigLayout migLayout = new MigLayout("always 4 cells, fillx", "[fill][fill][fill][fill]", "");
JPanel panel = new JPanel(migLayout);
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
panel.add(label1);
panel.add(label2);

我已经尝试过各种布局约束并添加组件参数,但它们的格式通常如下:

[  [ 1 ]         [ 2 ]         ]

最佳答案

我会选择 GridLayout . GridLayout 将根据给定的行/列(检查其构造函数)将面板分成多个单元格。然后每个组件将 100%(宽度和高度)适合单元格。

但是:如果您将网格布局设置为 1 行和 4 列(您的情况)并且您只添加 1 个组件,则布局将调整为:1 行和 1 列,因为它赢了'让空的空间。

技巧/解决方案:添加空组件的方式与我们向 BoxLayout 添加间隙的方式完全相同。

private static Component createSpace() {
    return Box.createRigidArea(new Dimension(1, 1));
}

缺点: 如果您想在面板显示后将组件添加到面板,则必须删除空格,因此您必须将所有空组件存储到结构中或执行以下操作(我总是喜欢这样做):

gridLayoutPanel.removeAll();
gridLayoutPanel.add(component1);
gridLayoutPanel.add(newComponent); //This was space before
gridLayoutPanel.add(createSpace());
gridLayoutPanel.add(createSpace());
gridLayoutPanel.repaint();
gridLayoutPanel.revalidate();

SSCCE将是(忽略组件的高度):

import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class GridLayoutTest extends JFrame {
    public GridLayoutTest() {
        getContentPane().setLayout(new GridLayout(1, 4));
        JButton component1 = new JButton("Component1");
        JButton component2 = new JButton("Component2");
        JButton component3 = new JButton("Component3");
        add(component1); //25% of the width
        add(component2); //25% of the width
        add(component3); //25% of the width
        add(createSpace()); //25% of the width
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(500, 200);
        setLocationRelativeTo(null);
    }

    private static Component createSpace() {
        return Box.createRigidArea(new Dimension(1, 1));
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new GridLayoutTest().setVisible(true));
    }
}

关于java - 当只使用一个单元格时,如何在 Miglayout 中强制每行 4 个单元格且宽度相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54196673/

相关文章:

java - 尽管使用 flowlayout,JFrame 组件仍能够通过 repaint 调用 PaintComponent

java - JTable 非常慢

java - 元素不会出现在具有 GridLayout 或 FlowLayout 的面板中,但具有 setBounds 时它们会出现在面板中

Java BorderLayout 等尺寸/对齐方式

java - 在android中使 Canvas 动画

java - JPopupMenu 上的 JComboBox

java - 如何使用 Jsoup 选择只有空格的元素?

java - 如何创建在java中的另一个按钮上运行单击事件的按钮?

java - 重新绘制来自用于计算三角形和外接圆的 swingworker 的小程序

java - 如何在java中使我的文本字段更大以适应GUI