8

私の CSE 205 (Java プログラミング 2) クラスでは、非常に単純な GUI アプレットを設計する必要があります。私は Swing にかなり精通しており、以前にいくつかの自分のプロジェクトで Swing を使用していました。私はプログラムをほとんど問題なく設計しました。Eclipse から実行すると、私のコンピューターで完璧に見えます。

ここに画像の説明を入力

しかし、それをオンラインで送信し、ブラウザで実行すると、UI がひどくおかしくなり、デフォルトに戻ります。

ここに画像の説明を入力

シンプルなため、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 のサイズをラベル「Enter a Pet Type:

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);

        }

    }

}

残念なことに、ある時点で、すべてがレイアウトを維持することが不可能になり、物事が崩壊するか、単に切り取られて見えるようになります。

これらの場合、コンテナ全体を 内に配置できますがJScrollPane、この場合は最悪のシナリオだと思います。

于 2013-02-19T01:49:35.623 に答える