5

Java Layouts を使用して非常に単純なウィンドウを作成しようとしています。ボタン、プログレス バー、ラベルの 3 つの要素を配置します。ボタンは垂直方向の中央に配置する必要があり、進行状況バーは全幅にする必要があり、ラベルは左揃えにする必要があります。

以下にいくつかのコードを示します (ペインが JFrame のコンテンツ ペインであり、ボタン、progressBar、およびラベルが以前に作成されていると想定してください)。

BoxLayout layout = new BoxLayout(pane, BoxLayout.Y_AXIS);
pane.setLayout(layout);
button.setAlignmentX(Component.CENTER_ALIGNMENT);
pane.add(button);
progressBar.setAlignmentX(Component.CENTER_ALIGNMENT);
pane.add(progressBar);
label.setAlignmentX(Component.LEFT_ALIGNMENT);
pane.add(label);

アプリケーションをテストすると、すべてがずれていて、めちゃくちゃになっていることがわかります。ボタンとラベルがランダムにインデントされており、ウィンドウのサイズを変更すると、インデントの量が奇妙な方法で変化します。プログレスバーは見栄えがします(全幅)。

何が起こっているのかわかりません。手がかりを教えてもらえますか?

4

5 に答える 5

7

BoxLayoutは異なる配置を処理できません。http://download.oracle.com/javase/tutorial/uiswing/layout/box.htmlを参照してください

その記事からの引用:「一般に、上から下のBoxLayoutオブジェクトによって制御されるすべてのコンポーネントは、同じX配置を持つ必要があります。同様に、左から右のBoxlayoutによって制御されるすべてのコンポーネントは、通常、同じY配置を持つ必要があります。 。」

于 2011-04-18T13:37:05.530 に答える
5

場合によっては、少しクリエイティブになり、ネストされたパネルを使用する必要があります。しかし、コードを生成する IDE によって使用されるように設計された他のレイアウト マネージャー (GridBagLayout、GroupLayout) を使用するときに必要なすべての制約を学習して記憶しようとするよりも、このアプローチの方が好きです。

import java.awt.*;
import javax.swing.*;

public class BoxLayoutVertical extends JFrame
{
    public BoxLayoutVertical()
    {
        Box box = Box.createVerticalBox();

        JButton button = new JButton("A button");
        button.setAlignmentX(Component.CENTER_ALIGNMENT);
        box.add(button);

        JProgressBar progressBar = new JProgressBar(0, 100);
        progressBar.setAlignmentX(Component.CENTER_ALIGNMENT);
        box.add(progressBar);

        JPanel panel = new JPanel( new BorderLayout() );
        JLabel label = new JLabel("A label");
        label.setAlignmentX(Component.LEFT_ALIGNMENT);
        panel.add(label);
        box.add(panel);

        add(box, BorderLayout.NORTH);
    }

    public static void main(String[] args)
    {
        BoxLayoutVertical frame = new BoxLayoutVertical();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.setSize(300, 200);
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}
于 2011-04-18T15:55:35.320 に答える
2

元の質問に対する私のコメントを補足するために、DesignGridLayoutを使用するスニペットを次に示します。

JButton button = new JButton("Button");
JProgressBar progressBar = new JProgressBar();
JLabel label = new JLabel("Label");

// The interesting stuff is in the next 4 lines
DesignGridLayout layout = new DesignGridLayout(getContentPane());
layout.row().center().add(button).withOwnRowWidth();
layout.row().center().fill().add(progressBar);
layout.row().left().add(label);

pack();

それはあなたの質問で説明したことを正確に行い、コンポーネントの特定の呼び出しを必要としません。

于 2011-04-18T13:32:51.270 に答える
1

BoxLayout を使用しないでください。非常に単純な場合にのみ機能します。

あなたの場合、GridBagLayout または (私のお気に入りの) GroupLayout をお勧めします。


GroupLayout については、いくつかのユーティリティ メソッドと便利なコンストラクターを備えたサブクラス ( LayoutHelper ) を作成しました。これにより、レイアウトの記述がはるかに簡単になります。

もちろん、通常、グループ内のすべてのコンポーネントを同じ方法で整列させるため、単純な場合ほど短くはありません。

    LayoutHelper h = new LayoutHelper(pane);

    h.setVerticalGroup
        ( h.sequential( button, progressBar, label));

    h.setHorizontalGroup
        ( ((ParallelGroup)h.parallel())
          .addComponent(button, Alignment.CENTER)
          .addComponent(progressBar)
          .addComponent(label, Alignment.TRAILING));

スクリーンショットは次のとおりです。

スクリーンショット

単純な「すべてを同じように並べる」場合、水平方向のグループは次のようになります。

    h.setHorizontalGroup
        ( h.parallel (button, progressBar, label));

(オプションで、アラインメントを示す最初の引数を使用)。

于 2011-04-18T12:44:21.573 に答える
1

あなたのコードは単なるスニペットかもしれませんが、への呼び出しがありませんpack()

手でスイングレイアウトをコーディングすることは、標準のレイアウトマネージャーでは非常にイライラすることがあります。そのためにMiG Layoutを使用します。それは簡単で、ほんの数行のコードで素敵なレイアウトを作成できます。BoxLayout の使用を強制されていない場合は、試してみることをお勧めします。

于 2011-04-18T12:35:37.303 に答える