使组件比BoxLayout中的可用区域小

时间:2015-03-19 19:28:39

标签: java swing boxlayout

请参阅下面的图片,显示我正在处理的GUI的一小部分。以下是生成它的代码。除了一件事,这个GUI几乎就是我想要的。我希望第二行中的JTextField只有它的宽度的1/3并且锚定在左侧。因此,它将直接位于其上方的第一个JTextfield下方且与其完全相同。并且,当帧在水平方向上重新调整大小时,它必须保持这种位置和大小关系。

那么,当水平尺寸发生变化时,如何添加始终与行的右2/3相对应的隐形填充?在这个时候,我并不关心垂直重新调整大小的行为。

感谢。

enter image description here

import java.awt.*;
import javax.swing.*;

public class BoxTest {
    private static void createAndShowGui() {
        Dimension comboBoxSize = new Dimension(70,30);
        JComboBox comboBox1 = new JComboBox(new String[]{"A", "B", "C"});
        JComboBox comboBox2 = new JComboBox(new String[]{"D", "E", "F"});
        JComboBox comboBox3 = new JComboBox(new String[]{"G", "H", "I"});
        JComboBox comboBox4 = new JComboBox(new String[]{"J", "K", "L"});
        comboBox1.setPreferredSize(comboBoxSize);
        comboBox2.setPreferredSize(comboBoxSize);
        comboBox3.setPreferredSize(comboBoxSize);
        comboBox4.setPreferredSize(comboBoxSize);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(650, 400);

        JPanel boxPanel = new JPanel();
        BoxLayout bl0 = new BoxLayout(boxPanel, BoxLayout.Y_AXIS);
        boxPanel.setLayout(bl0);

        JPanel row1Panel = new JPanel(new BorderLayout());
        JPanel hBox1 = new JPanel();
        BoxLayout bl1 = new BoxLayout(hBox1, BoxLayout.X_AXIS);
        hBox1.setLayout(bl1);
        JTextField t1 = new JTextField(15);
        JTextField t2 = new JTextField(15);
        JTextField t3 = new JTextField(15);
        hBox1.add(t1);
        hBox1.add(t2);
        hBox1.add(t3);
        row1Panel.add(comboBox1, BorderLayout.WEST);
        row1Panel.add(comboBox2, BorderLayout.EAST);
        row1Panel.add(hBox1, BorderLayout.CENTER);    
        boxPanel.add(row1Panel);

        JPanel row2Panel = new JPanel(new BorderLayout());
        JPanel hBox2 = new JPanel();
        BoxLayout bl2 = new BoxLayout(hBox2, BoxLayout.X_AXIS);
        hBox2.setLayout(bl2);
        JTextField t4 = new JTextField(15);
        hBox2.add(t4);
        row2Panel.add(comboBox3, BorderLayout.WEST);
        row2Panel.add(comboBox4, BorderLayout.EAST);
        row2Panel.add(hBox2, BorderLayout.CENTER);
        boxPanel.add(row2Panel);

        frame.add(boxPanel);
        frame.pack();
        frame.setVisible(true);
    }



    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGui();
            }
        });
    }
}        

2 个答案:

答案 0 :(得分:3)

我可能会尝试类似的事情:

  1. 创建一个" main"使用BorderLayout的面板。
  2. 使用GridLayout(0,1)创建面板。将左侧的两个组合框添加到此面板,并将此面板添加到" main"上的WEST。小组
  3. 使用GridLayout(0,1)创建面板。将右侧的两个组合框添加到此面板,并将此面板添加到" main"的EAST中。小组
  4. 使用网格布局(0,3)创建面板。将文本字段添加到此面板,并将此面板添加到" main"的中心。面板。
  5. 将主面板添加到框架的北部,以便尊重高度。如果宽度已更改,则可以在文本字段中添加/删除所有空格。

答案 1 :(得分:0)

您可以使用GridBagLayout为您的hBox2更好地调整GridBagConstraints并使用约束来强制1/3感觉。最后我能想到的是你可以改进整体布局并尝试GroupLayoutManagerA Visual Guide to Layout Managers是使用Swing布局管理器的教程的良好来源。此外,在组件上强制preferred大小要求布局管理器很挑剔。