3

同じフォームの複数のJLabelを作成してから、それらを同じJPanelに追加しようとしています。ただし、JLabelが1つしか表示されないため、理由がわかりません。これが私が書いたコードです:

    final JPanel labelPanel = new JPanel(new BorderLayout());
    panel.add(labelPanel, BorderLayout.NORTH);

    JLabel[] dashedLineLabel = new JLabel[wordLength];

    for (int i = 0; i < wordLength; i++)
    {   
        dashedLineLabel[i] = new JLabel("__  ");
        dashedLineLabel[i].setFont(new Font("Serif", Font.BOLD, 30));
        labelPanel.add(dashedLineLabel[i]);
    }   

どんな助けでも大歓迎です!ありがとうございました

4

4 に答える 4

4

BorderLayoutを適切に使用していません。ラベルはすべてレイアウトの中央の位置に追加されるため、相互に上書きされます。代わりに、またはさらに良いMigLayoutでFlowLayoutを試してください。

于 2012-10-31T13:38:57.563 に答える
3

BorderLayoutそのレイアウトには5つのコンポーネント(、、、、、)用のスペースしかないため、これを BorderLayout.CENTER使用するBorderLayout.NORTHことBorderLayout.WESTはできません。BorderLayout.SOUTHBorderLayout.EAST

組み込みレイアウトの1つを使用したソリューション:

必要に応じて、FlowLayoutまたはを使用することをお勧めします。GridLayoutBorderLayoutを外部パネルとして引き続き使用できますが、上記のレイアウトのいずれかを使用して内部パネルを導入するだけです。

したがって、を使用するとGridLayout、ラベルをグリッドレイアウトでラップしてから、これを境界線レイアウトに配置します。コードは次のようになります。

panel.setLayout(new BorderLayout());
final JPanel upperPanel = new JPanel(); 
panel.add(upperPanel, BorderLayout.NORTH); // add some stuff in the north

final JPanel innerPanel = new JPanel(new GridLayout(1,0));
JLabel[] dashedLineLabel = new JLabel[wordLength];
for (int i = 0; i < wordLength; i++) {   
    dashedLineLabel[i] = new JLabel("__  ");
    dashedLineLabel[i].setFont(new Font("Serif", Font.BOLD, 30));
    innerPanel.add(dashedLineLabel[i]);
} 

panel.add(innerPanel, BorderLayout.CENTER);

MigLayoutを使用したソリューション:

異なるレイアウトから選択したくない場合は、サードパーティのレイアウトマネージャーであるMigLayoutを使用することもできます。これは、基本的に1つのマネージャーですべてのオプションを提供します。そして、あなたはたくさんのよりクリーンなコード(imho)を持つでしょう。欠点はもちろん、依存関係として外部jarファイルを使用する必要があることです。(ちなみに、MigLayoutについて知って以来、別のレイアウトマネージャーを使用したことはありません。)

MigLayout

final JPanel labelPanel = new JPanel(new MigLayout("", "", "")); 
panel.add(labelPanel, "north");

JLabel[] dashedLineLabel = new JLabel[wordLength];
for (int i = 0; i < wordLength; i++) {   
    dashedLineLabel[i] = new JLabel("__  ");
    dashedLineLabel[i].setFont(new Font("Serif", Font.BOLD, 30));
    panel.add(dashedLineLabel[i], "wrap");
}
于 2012-10-31T13:57:09.760 に答える
2

BorderLayout仕様によると

境界線レイアウトは、コンテナをレイアウトし、そのコンポーネントを北、南、東、西、および中央の5つの領域に合うように配置およびサイズ変更します。各領域には1つのコンポーネントしか含めることができず、対応する定数(NORTH、SOUTH、EAST、WEST、およびCENTER)で識別されます。境界線レイアウトのコンテナにコンポーネントを追加するときは、これら5つの定数のいずれかを使用してください。

ここ

デフォルトのaddメソッドを使用しているため、親の中心にコンポーネントが追加されます。したがって、この場合、追加されているコンポーネントは1つだけです。

他のレイアウト(つまり、フローまたはその他)を使用して、ニーズを満たすことができます。

于 2012-10-31T13:46:02.910 に答える
1

を使用BorderLayoutし、簡単な方法でコンポーネントを追加すると、addそれらはすべて中央に追加されます。センターに他のコンテナがない場合、それらはすべて互いに重なり合っており、一番上のコンテナを見ることができます。BorderLayoutを正しく使用するか、別のレイアウトを使用してください。

BorderLayoutのドキュメントから:

A border layout lays out a container, arranging and resizing its components to fit in five regions: north, south, east, west, and center. Each region may contain no more than one component, and is identified by a corresponding constant: NORTH, SOUTH, EAST, WEST, and CENTER. When adding a component to a container with a border layout, use one of these five constants, for example:

    Panel p = new Panel();
    p.setLayout(new BorderLayout());
    p.add(new Button("Okay"), BorderLayout.SOUTH);


As a convenience, BorderLayout interprets the absence of a string specification the same as the constant CENTER:

    Panel p2 = new Panel();
    p2.setLayout(new BorderLayout());
    p2.add(new TextArea());  // Same as p.add(new TextArea(), BorderLayout.CENTER);
于 2012-10-31T13:41:41.560 に答える