5

コードでいくつかのJComponentを生成し、GridBagレイアウトを使用してそれらを配置しています。私のレイアウトは12行3列で構成され、各行はJSlider、JCheckBox、およびJLabelで構成されています。UIの生成に使用しているコードは次のとおりです。

final int NUM_MOTORS = 12;

// This is the panel I'm adding the components to.
pnlMotorSliders.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();

for (int i = 0; i < NUM_MOTORS; ++i) {
    c.gridy = i;

    // Create the slider
    JSlider slider = new JSlider(SwingConstants.HORIZONTAL, 10, 4085, 10);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.weightx = 0.9;
    pnlMotorSliders.add(slider, c);

    // Create the checkbox
    JCheckBox checkBox = new JCheckBox();
    checkBox.setOpaque(true);
    checkBox.setBackground(Color.blue);
    c.fill = GridBagConstraints.NONE;
    c.gridx = 1;
    c.weightx = 0.1;
    pnlMotorSliders.add(checkBox, c);

    // Create the current label
    JLabel label = new JLabel("0");
    label.setBorder(BorderFactory.createLineBorder(Color.red));
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 2;
    c.weightx = 0.2;
    pnlMotorSliders.add(label, c);
}

私が抱えている問題は、JLabelのいずれかにテキストを設定すると、設定しているテキストの幅がJLabelの幅。次の2つのスクリーンショットは、私が何を意味するかを示しています(赤と青の境界線はデバッグ用です)。

JLabelテキストを変更する前のレイアウト。

下部のJLabelテキストを変更した後のレイアウト。 ラベルが大きくなっていることに注目してください。

下部のJLabelのテキストを「-12」に設定しました。JLabelはテキストよりもはるかに幅が広いように見えますが、サイズが変更されており、残りのレイアウトに影響を与えています。

なぜこれが起こっているのですか、それを防ぐために何ができますか?

4

4 に答える 4

5

最小、優先、および最大サイズを設定することにより、ラベルのサイズを修正できます。

label.setMinimumSize(width, height);
label.setPreferedSize(width, height);
label.setMaximumSize(width, height);

また、GridBagConstraints#fillをNONEに設定してください。ただし、それがまだ必要かどうかはわかりません(必要だと思います)。

編集:ところで、フォーカスされたコンポーネントの周りの厄介な破線を取り除くために、フォーカスされないように設定することができます:

slider.setFocusable(false);
于 2012-06-05T12:24:16.567 に答える
2

推奨サイズに設定するソリューションは、GridBagLayoutでコンポーネントがバッグを水平方向に満たしていない場合にのみ機能します。

もう1つの解決策は、GridBagLayoutのその列のコンポーネントにかけた重みを削除することです。その後、列幅を手動で制御できます。(設計時に)これを行う簡単な方法は、高さがゼロで特定の幅が必要なJLabelを列に配置することです。

どうしてこれなの?GridBagLayoutがどのように機能するかを掘り下げる必要があります。

GridBagLayoutは、必要なスペースに基づいて列のサイズを決定し、重みを使用して「残りの」スペースを割り当て、結果の列幅がパネルの合計幅になるようにします。各列に必要なスペースは、その列の最も幅の広いコンポーネントを見つけることによって計算されます。

各コンポーネントに必要なスペースは、コンポーネントにどの幅を使用するかを尋ねることによって決定されます。あなたの場合、「0」のJLabelは「-12」のJLabelよりも小さいため、列のサイズが変化しています。

残りのスペースは、各列のコンポーネントに割り当てられた水平方向の重みに基づいて割り当てられます。重みが合計され、各列のパーセンテージは、その列の合計のパーセントに基づいて決定されます。

列のサイズは、必要なスペースと残りのスペースに基づいて決定されます。したがって、列内のすべてのコンポーネントに重みがない場合、スペースが残っていないため、動的な変更が行われません。

3番目の解決策は、GridBagLayoutを使用しないことです。

于 2013-04-04T12:32:46.187 に答える
0

を使用して、ラベルの希望するサイズを明示的に設定しますJLabel#setPreferredSize(Dimension)

このようにして、コンポーネントのサイズをロックし、レイアウトマネージャーにサイズを変更しないように指示します。

于 2012-06-05T12:19:47.563 に答える
0
label.setPreferredSize(new Dimension(width, height));

これは私がそれを機能させるために見つけることができた唯一の方法でした。Minimumaおよび/またはaを設定しMaximumても、何も起こりませんでした。また、Java 8の私にとっては、を使用する必要がありました。そうDimensionでない場合、以前の不適切なサイズに変更はありませんでした。

于 2018-11-14T01:31:00.463 に答える