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的代码发布为文本。工作完美,解决了我遇到的问题工作完美,解决了我遇到的问题