不稳定的Miglayout - 制作两个相同大小的增长列

时间:2018-05-09 09:11:22

标签: java swing miglayout

我有这个简单的MigLayout:

enter image description here

最后两个组件(JScrollPanes)应该具有相同的宽度。但事实上,如果我调整窗口大小,它们会随机跳跃。是否可以使它们的宽度相等?我怎么能安排组件使它看起来对称?

2 个答案:

答案 0 :(得分:1)

大多数时候,我更喜欢使用java的内置工具,而不是为这些简单的情况混合更多的复杂库和依赖项。我认为,当您可以通过这样的微不足道的努力来实现解决方案时,不需要使用第三方库,例如MIG。这种偏好来自于您所处的情况:没有那么多人使用购买的工具,因此您无法从社区获得如此多的帮助。

我知道这个问题询问MigLayout但我更倾向于表明在这种简单的情况下没有必要使用它。 MIG库很丰富,有一些有用的组件可以让你的生活更轻松但是在布局方面我更喜欢纯java。

使用纯BorderLayoutGridLayout

对您的布局进行采样
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

public class TestMain {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        JFrame f = new JFrame();
        f.setBounds(50, 50, 500, 400);
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.add(createSpacerPanel(10, 10), BorderLayout.NORTH);
        f.add(createSpacerPanel(10, 10), BorderLayout.SOUTH);
        f.add(createSpacerPanel(10, 10), BorderLayout.EAST);
        f.add(createSpacerPanel(10, 10), BorderLayout.WEST);
        f.add(new MainPanel());
        f.setVisible(true);
    }

    private static JPanel createSpacerPanel(int width, int height){
        JPanel spacer = new JPanel();
        spacer.setPreferredSize(new Dimension(width, height));
        return spacer;
    }
}

class MainPanel extends JPanel{

    public MainPanel() {
        init();
    }

    private void init() {
        JPanel northPanel = new JPanel(new BorderLayout(10, 10));
        northPanel.setPreferredSize(new Dimension(100, 60));
        northPanel.add(new JLabel("Class Expression: "), BorderLayout.NORTH);
        JTextArea classExpressionTextArea = new JTextArea();    
        classExpressionTextArea.setSize(10, 40);
        northPanel.add(new JScrollPane(classExpressionTextArea), BorderLayout.CENTER);
        JButton calculateButton = new JButton("Calculate");
        northPanel.add(calculateButton, BorderLayout.EAST);

        JPanel definitionPanel = new JPanel(new BorderLayout(10,10));       
        definitionPanel.add(new JLabel("Definitions Found: "), BorderLayout.NORTH);
        JTextArea definitionsTextArea = new JTextArea();        
        definitionPanel.add(new JScrollPane(definitionsTextArea), BorderLayout.CENTER);

        JPanel signaturePanel = new JPanel(new BorderLayout(10,10));    
        signaturePanel.add(new JLabel("Target Signature: "), BorderLayout.NORTH);
        JTextArea targetTextArea = new JTextArea();
        signaturePanel.add(new JScrollPane(targetTextArea), BorderLayout.CENTER);

        GridLayout gridLayout = new GridLayout(1,1,10,10);
        JPanel centerPanel = new JPanel(gridLayout);
        centerPanel.add(definitionPanel);
        centerPanel.add(signaturePanel);

        setLayout(new BorderLayout(10,10));
        add(northPanel, BorderLayout.NORTH);
        add(centerPanel, BorderLayout.CENTER);      
    }
}

完全可调整大小的输出:

enter image description here

在考虑布局和定位以及在网格单元上跨越组件的方式时,使用类似于GridBagLayout的{​​{1}}可以实现相同的目的。

希望这会有所帮助。

答案 1 :(得分:0)

您需要您的列在列约束中使用相同的sizegroup / sg。这样,两列将始终具有相同的宽度。

赞:

setLayout(new MigLayout("", "[sizegroup main, grow][sizegroup main,grow]"[][][][grow]"));

另请参阅关于sizegroup的{​​{3}}。