【问题标题】:Unstable Miglayout -- make two grow columns of the same sizeUnstable Miglayout - 使两个相同大小的增长列
【发布时间】:2018-10-19 08:22:38
【问题描述】:

我有这个简单的 MigLayout:

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

【问题讨论】:

  • 你真的需要使用migLayout吗?还是只想要输出?解决方案使用其他布局(例如边框布局和网格或框布局)对您来说重要吗?
  • 您可以使用内置的 GridBagLayout 或混合使用 BorderLayoutGridLayout 来实现这个简单的面板。检查我的答案。
  • 这里我会有更多的控制,这很简单,可以隔离问题。
  • 将构建 GUI 的代码发布为文本。

标签: java swing miglayout


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

以及完全可调整大小的输出:

使用GridBagLayout 可以实现相同的效果,这与MigLayout 在考虑布局和定位以及跨越网格单元格上的组件的方式相似。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    像这样:

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

    另请参阅MigLayout Cheatsheet 关于sizegroup

    【讨论】:

    • 完美运行并解决了我遇到的问题
    • 感谢您的提示。对我来说也很完美。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 2016-04-27
    • 2016-06-14
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2012-12-20
    • 2010-11-12
    相关资源
    最近更新 更多