java - Spany 2 与 MigLayout 一行

标签 java position miglayout

摘要: 我想让一个组件跨越两行,尽管只有一行可用。下面的屏幕截图将说明我的问题。如果您愿意,您会在最后找到 SSCCE 来进行测试。

我已经提出了解决方法,但我想知道是否有更好的解决方案。

<小时/>

案例1

由于添加了足够的元素,因此创建了两行:
Enough rows

相关代码:

JPanel panel = new JPanel(new MigLayout("wrap 7, debug, fill", "grow, fill", "grow, fill"));
int n = 8;
for(int i=0; i<n; i++) {
    JPanel p = new JPanel();
    p.setBackground(new Color(rand.nextInt()));
    if(i == 2) {
        panel.add(p, "spany 2");
    }
    else {
        panel.add(p, "");
    }
}

因此,当添加第 8 个面板时,MigLayout 会自动将其换行,并且有两行。现在第三个面板可以跨越两行。

案例2

只有一行:
Not enough rows

相关代码更改:

int n = 7;

因此该行填充了 7 个面板,但 MigLayout 不会换行到新行,因此第三个面板无法跨越两行。

案例3

这是我的解决方法:
Workaround

相关代码更改:

JPanel panel = new JPanel(new MigLayout("wrap 7, debug, fill", "grow, fill", "[grow, fill][grow, fill]"));

所以我告诉 MigLayout 有两行,所以第三个元素可以跨越两行。问题是我不知道会有多少行(或者说计算起来不方便)

还有其他可能实现这一目标吗?我的目标是将单个面板动态放大到其双倍高度。

<小时/>

SSCCE:

public class MigPositionTest {

    public static void main(String[] args) {
        new MigPositionTest(); //Yes it is not started within EventDispatcher
    }

    private Random rand = new Random(123);

    public MigPositionTest() {
        JFrame frame = new JFrame();
        frame.setTitle("MigLayout Span Testing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setLocationRelativeTo(null);

        JPanel panel = new JPanel(new MigLayout("wrap 7, debug, fill", "grow, fill", "grow, fill"));

        int n = 8;

        for(int i=0; i<n; i++) {
            JPanel p = new JPanel();
            p.setBackground(new Color(rand.nextInt()));

            if(i == 2) {
                panel.add(p, "spany 2");
            }
            else {
                panel.add(p, "");
            }

        }

        frame.setContentPane(panel);
        frame.setVisible(true);
    }

}

最佳答案

span 不会为我们创建新的列或行。必须有 其他列或行中的其他组件。 FormLayout 的工作原理 相同的。

我提出了两种可能的解决方案。

解决方案1

我们可以使用w约束来设置面板的首选大小。 较高的面板尺寸加倍:

package com.zetcode;

import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;


public class MigPanels extends JFrame {

    public MigPanels() {

        initUI();

        setTitle("Spanning");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private void initUI() {

        JPanel pnl = new JPanel(new MigLayout("wrap 5"));

        pnl.add(createPanel(), "w 50, h 150, top");
        pnl.add(createPanel(), "w 50, h 150, top");
        pnl.add(createPanel(), "w 50, h 300");
        pnl.add(createPanel(), "w 50, h 150, top");
        pnl.add(createPanel(), "w 50, h 150, top");

        add(pnl);

        pack();
    }

    private JPanel createPanel() {

        JPanel pnl = new JPanel();

        pnl.setBorder(BorderFactory.createEtchedBorder());

        return pnl;
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MigPanels ex = new MigPanels();
                ex.setVisible(true);
            }
        });
    }
}

Spanning

解决方案2

我们在第二行放置一个虚拟标签:

package com.zetcode;

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;


public class MigPanels2 extends JFrame {

    public MigPanels2() {

        initUI();

        setTitle("Spanning");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private void initUI() {

        JPanel pnl = new JPanel(new MigLayout("wrap 5"));

        pnl.add(createPanel());
        pnl.add(createPanel());
        pnl.add(createPanel(), "growy, spany 2");
        pnl.add(createPanel());
        pnl.add(createPanel());

        // dummy label
        pnl.add(new JLabel(""), "cell 0 1, w 50, h 150");  

        add(pnl);

        pack();
    }

    private JPanel createPanel() {

        JPanel pnl = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(50, 150);
            }              
        };

        pnl.setBorder(BorderFactory.createEtchedBorder());

        return pnl;
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MigPanels2 ex = new MigPanels2();
                ex.setVisible(true);
            }
        });
    }
}

关于java - Spany 2 与 MigLayout 一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24983349/

相关文章:

java - JNI - 带有 ByteBuffer 参数的 native 方法

java - 如何向 URLStreamHandler 提供上下文?

扩展 String(或类似)的 Java 类

java - 查看 Binding with Java 11,Android Studio 总是显示错误(但运行没有任何问题)

java - MigLayout 列约束

java - 使用 MigLayout 限制列的增长

java - 当使用 Java 中的 MigLayout 将高度或宽度设置为 100% 时,子级将扩展到其父级的边界

c# 数据表在位置 0 插入列

html - td 在 tr 中的定位

html - 全宽图像上的相对定位