簡體   English   中英

帶MigLayout的Spany 2帶有一行

[英]Spany 2 with MigLayout with one row

摘要:我想讓一個組件跨越兩行,盡管只有一行可用。 以下屏幕截圖將說明我的問題。 如果需要,您將在末尾找到SSCCE進行測試。

我提供了一種解決方法,但是我想知道是否有更好的解決方案。


情況1

因為添加了足夠的元素,所以創建了兩行:
足夠的行

相關代碼:

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會自動包裝它,並且有兩行。 現在,第三個面板可以跨越兩行。

情況二

只有一行:
行數不足

相關代碼更改:

int n = 7;

因此,該行由7個面板填充,但是MigLayout不會換行到新行,因此第3個面板不能跨越兩行。

情況3

這是我的解決方法:
解決方法

相關代碼更改:

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

所以我有點告訴MigLayout有兩行,因此第3個元素可以跨越兩行。 問題是我不知道會有多少行(或者說計算起來不方便)

還有其他可能實現這一目標嗎? 我的目標是將單個面板動態放大到雙倍高度。


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

跨越

解決方案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);
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM