Java 布局不稳定--使两个增长列大小相同

Java 布局不稳定--使两个增长列大小相同,java,swing,miglayout,Java,Swing,Miglayout,我有一个简单的布局: 最后两个组件(JScrollPanes)的宽度应该相同。但事实上,如果我调整窗口大小,它们会随机跳跃。有可能使它们的宽度相等吗?除此之外,我如何安排组件以使其看起来对称?大多数时候,我更喜欢使用java的内置功能,而不是将复杂得多的库和依赖项混合到这种简单的情况中。我认为,当您可以通过像这样的简单工作来实现解决方案时,就不需要使用第三方库,如MIG。这种偏好来自于您所处的情况:没有那么多人使用购买的工具工作,因此您无法从社区获得这么多帮助 我知道这个问题问的是关于MigL

我有一个简单的布局:


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

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

我知道这个问题问的是关于
MigLayout
,但我更愿意表明,对于这种简单的情况,没有必要使用它。MIG库很丰富,有一些有用的组件,可以让您的生活更轻松,但说到布局,我更喜欢纯java

使用纯
BorderLayout
GridLayout
对布局进行采样:

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
在布局、定位和跨越网格单元组件方面的思路类似


希望这会有所帮助。

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

我知道这个问题问的是关于
MigLayout
,但我更愿意表明,对于这种简单的情况,没有必要使用它。MIG库很丰富,有一些有用的组件,可以让您的生活更轻松,但说到布局,我更喜欢纯java

使用纯
BorderLayout
GridLayout
对布局进行采样:

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
在布局、定位和跨越网格单元组件方面的思路类似


希望这会有所帮助。

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

像这样:

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

另请参见关于
sizegroup

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

像这样:

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

另请参见关于
sizegroup

是否确实需要使用migLayout?还是仅仅想要输出?解决方案使用其他布局(如边框布局和网格或长方体布局)对您是否重要?您可以使用内置的GridBagLayout或混合使用BorderLayout和GridLayout来实现此简单面板。检查我的答案。我会在这里有更多的控件,这非常简单,可以隔离问题。将构建GUI的代码作为文本发布。你真的需要使用migLayout吗?还是仅仅想要输出?解决方案使用其他布局(如边框布局和网格或长方体布局)对您是否重要?您可以使用内置的GridBagLayout或混合使用BorderLayout和GridLayout来实现此简单面板。检查我的答案。我会在这里有更多的控件,这非常简单,可以隔离问题。将构建GUI的代码发布为文本。工作完美,解决了我遇到的问题工作完美,解决了我遇到的问题