0

JPanel内のすべてのオブジェクトがJTextFieldのサイズを使用するという異常な問題が発生しました。他のオブジェクトにサイズを強制しようとしても、テキストフィールドに指定されたサイズを独自のものとして使用します。たとえば、次のように独自の方法で単一のパネルを設定しようとしています。

private JPanel setupID() {
    JLabel projLbl = new JLabel("Project ID:");
    JButton verifyBtn = new JButton("Verify ID");
    projID = new JTextField(25);
    verifyBtn.setToolTipText("Verifies that the entered ID is not already in use.");
    JPanel theID = new JPanel(new GridLayout(1,0));
        theID.add(projLbl);
        theID.add(projID);
        theID.add(verifyBtn);
    return theID;
}

最終的には次のようなウィンドウになります...ここに画像の説明を入力してください これJFrame frame;が読み込まれているウィンドウにはframe.pack()、フレームサイズを自動調整するためのメソッドが呼び出されます。BorderLayout()異なる領域(たとえば、WEST、CENTER、EAST)で個々のオブジェクトを作成すると、意図したとおりに機能しますが、パネルにロードされると、すべてのサイズはに基づいてサイズが変更されますJTextField(25)。これがなぜであるかについて何か考えはありますか?

4

2 に答える 2

2

Javaのドキュメントから引用:

GridLayout クラスは、コンテナーのコンポーネントを長方形のグリッドに配置するレイアウト マネージャーです。コンテナを等倍の長方形に分割し、各長方形に 1 つのコンポーネントを配置 [...]

私の推測では、長方形のサイズは、最大のコンポーネントの優先サイズに基づいています。別のレイアウトを使用する必要があります。必要に応じてGridBagLayoutの方が適している可能性があります。

于 2013-01-08T22:58:45.383 に答える
2

Code-Guru と asemax が指摘したように。GridLayout使用可能なスペースを使用して、コンポーネントをグリッドに均等にレイアウトするように設計された を使用しているように見えます。

GridBagLayoutのようなものを代わりに使用してみてください...

ここに画像の説明を入力

public class BadLayout08 {

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

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

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            add(new JLabel("Project ID:"));
            add(new JTextField(25));
            add(new JButton("Verify ID"));
        }

    }

}

どのレイアウトを使用するかを決定する必要がある場合は、 A Visual Guide to Layout Managersが役に立つかもしれません。

于 2013-01-08T23:01:46.453 に答える