1

Java スイング:

new GridBagConstraints(); を常に呼び出す必要がないように、GridBagConstraints を返すメソッドを作成しました。一連の変数を設定します。次のように機能します。

displayPanel.add(labelPanel, createGBC(0, 0, 2);
displayPanel.add(nosePanel, createGBC(1, 0, 3);
displayPanel.add(mainPanel, createGBC(2, 0, 3);

等..

そして、私の createGBC のコード:

private GridBagConstraints createGBC(int x, int y, int z) {
    gbc = new GridBagConstraints();
    gbc.gridx = x;
    gbc.gridy = y;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    gbc.anchor = (x == 0) ? GridBagConstraints.EAST : GridBagConstraints.WEST;
    if (z == 0) gbc.insets = new Insets(0, 0, 0, 0);
    else if (z == 1) gbc.insets = new Insets(8, 0, 0, 0);
    else if (z == 2) gbc.insets = new Insets(4, 4, 0, 4);
    else if (z == 3) gbc.insets = new Insets(0, 2, 0, 2);
    else if (z == 4) gbc.insets = new Insets(0, 0, 16, 0);
    else if (z == 5) gbc.insets = new Insets(6, 0, 16, 0);
    return gbc;
}

私の質問は次のとおりです。else if ステートメントを単純に大量に実行するよりも、多くの異なるインセットを処理するためのより良い方法はありますか? 私の現在の方法では、いくつかの問題が発生します。

  1. どのインセットがどの z の値に割り当てられているか分からなくなり始めています。(読みやすく、再利用しやすくするためにリファクタリングしようとしています)。

  2. 実際には、問題 1 を悪化させる挿入プリセットをさらに追加する必要があるかもしれません。

4

2 に答える 2

2

コンポーネントを に追加するとGridBagLayoutGridBagLayoutは制約のコピーを作成します。これは、たとえば、小さな変更を加えるたびに新しいインスタンスを作成する必要がないことを意味します...

setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.insets = new Insets(0, 0, 0, 0);
add(labelPanel, gbc);

gbc.gridx = 1;
gbc.insets = new Insets(0, 2, 0, 2);
add(nosePane, gbc);
gbc.gridx = 2;
add(mainPanel, gbc);

これは、必要な属性を変更するだけでよく、以前に設定した基本的な制約を引き続き再利用できることを意味します。

変更/リセットする必要がある属性の量が多くなった場合 (または変更する必要がある属性を覚えていない場合)、制約の新しいインスタンスを作成できます。

このように、コンポーネントの「グループ」に対して単一のインスタンスを使用する傾向があります。

あなたの場合、を再利用したい場合はInsets、一連の定数を作成してそれらを使用することができます。これにより、コードが読みやすくなり、維持しやすくなります。

于 2015-10-26T20:29:53.577 に答える
1

MadProgrammer が述べたように、GridBagLayout は追加された各コンポーネントの制約を複製するため、毎回新しい GridBagConstraints オブジェクトは必要ありません。

通常、 int value ( z) を enum 定数に置き換え、 Insets オブジェクトを値としてEnumMapに格納することをお勧めします。しかし、あなたの場合、より簡単な解決策があります:

GridBagConstraints gbc = new GridBagConstraints();

gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(4, 4, 0, 4);
displayPanel.add(labelPanel, gbc);

gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 2, 0, 2);
displayPanel.add(nosePanel, gbc);
displayPanel.add(mainPanel, gbc);

gridx、gridy、gridwidth、または gridheight をまったく設定していないことに注意してください。gridwidth と gridheight はデフォルトですでに 1 です。gridx と gridy のデフォルトは GridBagConstraints.RELATIVE ですこれはたまたまあなたが望むことを正確に行います: gridwidth または gridheight がREMAINDERに変更されない限り、同じ行に新しいコンポーネントを自動的に追加します。その場合、新しい行または列が (それぞれ)次の相対的に配置されたコンポーネントに対して開始されます。

于 2015-10-26T20:30:19.917 に答える