8

对于我的 CSE 205(Java 编程 2)课程,我们必须设计一个非常简单的 GUI 小程序。我对 Swing 非常熟悉,之前在我自己的一些项目中使用过它。我设计的程序几乎没有问题,当从 Eclipse 运行时,它在我的计算机上看起来很完美:

在此处输入图像描述

但是当我在线提交它时,它在浏览器中运行时,用户界面变得严重失智,恢复到默认状态:

在此处输入图像描述

我已经习惯了使用 GridBagLayout,因为它很简单。这就是我在这里使用的。CreatePanel 和 SelectPanel 类(如第一张图片所示)都扩展了 JPanel(根据我的教授)。我设置每个使用:

this.setLayout(new GridBagLayout());

以及每个组件:

//Call the method addItem() to add the create button to the panel
addItem(this, createB,0,2,2,1,defaultInset,GridBagConstraints.CENTER);



 //-------
    public void addItem(JPanel p, JComponent c, int x, int y, int width, int height, int[] inset, int align)
      {
            GridBagConstraints gc = new GridBagConstraints();
            gc.gridx = x;
            gc.gridy = y;
            gc.gridwidth = width;
            gc.gridheight = height;
            gc.weightx = 0;
            gc.weighty = 0;
            gc.insets = new Insets(inset[0],inset[1],inset[2],inset[3]);
            gc.anchor = align;
            gc.fill = GridBagConstraints.NONE;
            p.add(c, gc);
        }

有人对可能发生的事情有任何想法吗?考虑到我一半以上的时间都花在让布局看起来正确上,我想要一个简单的修复。如果需要,我可以发布更多代码。感谢您的任何建议。

- 编辑 -

好吧,我根据@MadProgrammer 的建议做了一些尝试。我想我已经缩小了问题所在。

这是我用来将 JTextField 的大小设置到标签“输入宠物类型:

petTypeTF = new JTextField("");
petTypeTF.setPreferredSize(new Dimension(125, 60));

现在,如果我将代码更改为其他任何内容,例如设置列数:

petTypeTF = new JTextField("",12);
 petTypeTF.setPreferredSize(new Dimension(125, 60));

当我在线提交它时,我得到的 UI 看起来与它相同。与设置列数有关的事情似乎搞砸了。这对任何人都有帮助吗?

4

1 回答 1

9

确实没有足够的代码来确定问题的全部范围,但一些想法可能会有所帮助。

GridBagLayout如果可能的话,会想尝试根据首选尺寸来布置它的组件。如果不能,它将查看最小尺寸。

确保您正在创建带有列(以及在文本区域的情况下)行的文本组件。这将根据许多重要因素自动确定组件的首选尺寸。

在此处输入图像描述

public class BadLayout11 {

    public static void main(String[] args) {
        new BadLayout11();
    }

    public BadLayout11() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JTabbedPane pane = new JTabbedPane();
                pane.add("Pet List Creation", new TestPane());

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(pane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {

            setLayout(new GridBagLayout());

            JPanel fields = new JPanel(new GridBagLayout());

            JTextField field = new JTextField(12);
            JTextArea area = new JTextArea(10, 20);
            JLabel label = new JLabel("Enter a Pet Type");
            JButton button = new JButton("Create a Pet");

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(2, 2, 2, 2);
            gbc.anchor = GridBagConstraints.WEST;

            fields.add(label, gbc);
            gbc.weightx = 1;
            gbc.gridx++;
            fields.add(field, gbc);

            gbc.fill = GridBagConstraints.NONE;
            gbc.gridx = 0;
            gbc.weightx = 0;
            gbc.gridy++;
            gbc.gridwidth = 2;
            gbc.anchor = GridBagConstraints.CENTER;
            fields.add(button, gbc);

            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(2, 2, 2, 2);
            gbc.gridheight = GridBagConstraints.REMAINDER;
            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.fill = GridBagConstraints.BOTH;
            add(fields, gbc);
            gbc.gridx++;
            add(new JScrollPane(area), gbc);

        }

    }

}

不幸的是,在某些时候,一切都会达到根本无法维持布局的程度,并且事情会崩溃或只是显得被剪裁。

在这些情况下,您可以将整个容器放在 aJScrollPane中,但在这种情况下,我认为这是最坏的情况。

于 2013-02-19T01:49:35.623 回答