Swing BoxLayout问题 - 不能让填充物完成它们的工作

Joe*_*oel 7 java layout swing boxlayout

我想做什么

在Swing中,我试图使用一个BoxLayout或等效的线性容器,但容器中的项目是垂直拉伸的.在我的应用程序中,我不希望它们垂直拉伸.

我知道我可以在组件上设置preferredSize或maximumSize,但是下面的代码只是一个复制器,我不能硬编码或最大化组件的大小,这些组件的真实性更加复杂和动态.而我只是不能使用BorderLayoutBorderLayout.TOP位置,因为没有滚动条都不会显示如果我这样做.我可能需要滚动窗格.


我试过了什么

所以我尝试使用fillersin in BoxLayoutin In Inibleible Components as Filler,但它只是不起作用.虽然在Oracle文档中,它似乎正是我所需要的.以下是我的尝试:

    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;


    public class TestBoxLayout implements Runnable {

        public static void main(String[] args) {
            SwingUtilities.invokeLater(new TestBoxLayout());
        }

        @Override
        public void run() {
            JFrame f = new JFrame("test box layout");

            JPanel b = new JPanel();
            b.setLayout(new BoxLayout(b, BoxLayout.PAGE_AXIS));

            b.add(new JTextField("field 1"));
            b.add(new JTextField("field 2"));
            b.add(new JTextField("field 3"));
            b.add(Box.createVerticalGlue());

            f.setContentPane(b);
            f.setSize(500, 200);
            f.setVisible(true);
        }

    }
Run Code Online (Sandbox Code Playgroud)

这是我得到的结果:

填料不起作用


第二次尝试

我尝试使用Box类而不是JPanelwith BoxLayout,但视觉效果完全相同.这是我的第二次尝试:

    import javax.swing.Box;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;


    public class TestBox implements Runnable {

        public static void main(String[] args) {
            SwingUtilities.invokeLater(new TestBox());
        }

        @Override
        public void run() {
            JFrame f = new JFrame("test box");

            Box b = Box.createVerticalBox();

            b.add(new JTextField("field 1"));
            b.add(new JTextField("field 2"));
            b.add(new JTextField("field 3"));
            b.add(Box.createVerticalGlue());

            f.setContentPane(b);
            f.setSize(500, 200);
            f.setVisible(true);
        }

    }
Run Code Online (Sandbox Code Playgroud)

我想做什么

有谁知道如何修复这些填充物并让它们起作用?对给定代码的修复将是非常棒的.

这是我用油漆制作的图纸,它显示了我想要的结果: 预期结果

Hei*_*bug 2

BoxLayout 非常适合您想要做的事情。作为最后一个组件的胶水插件很好。为什么不在 JTextFields 上简单地使用 setMaximumSize 方法?我不确定 JTextFields 本身是否可以满足您的需求。如果使用 setMaximumSize 不起作用,请将每个 JTextField 放入 JPanel 中,然后在每个 JPanel 上使用 setMaximumSize 。