1

コンポーネントをJFrameの必要な場所に正確に配置するための堅実で推奨される方法は?

私の場合、メニューとして機能する単純な Jframe があります。フレームは、上部のラベルと中央の 3 つのボタンで構成されています。フリー デザインを使用すると、3 つのボタンがフレーム上に浮いているように見え、プロジェクトを実行すると、見苦しい位置に移動します。3 つのボタンが最大長 (フレームの両側) までドラッグされた場合にのみ、「ロックされた」ように動作します。これは非常に醜い.. フレームの中央にある 3 つのボタンをまとめて配置したい。

私はNetbeansを使用しています。フリーデザインは私が使ってきたものですが、多くのコンポーネントがあり、お互いの位置に「スナップイン」できる場合にのみ適しています. 他のセット レイアウト マネージャーを使用してもうまくいきませんでした。経験のある人は、このような問題にどのように対処しますか?

徹底的に学ぶことに興味があります。この質問が非常に素人である場合、誰かが少なくともテキストブックまたは GUI 学習の他のソースを推奨できますか? (私は「Javaで最初にオブジェクトを作成する」を2回繰り返しましたが、そこにはGUI構築の非常に基本的な説明しかありません)。

方向性をありがとう。

4

2 に答える 2

6

事は非常に単純ですが、もちろん、自分でもう少し検索する必要があります。

ところで、あなたはボタンのレイアウトとサイズの管理に問題があります。

紛らわしいコードを生成し、実際に何が起こっているのかを理解するのは良くないため、レイアウト作成者を使用することを忘れてください。

通常、初心者向けに、BoxLayout という特定のレイアウトについて話します [編集: もちろん、目標に到達するためのより簡単な方法はたくさんあります。この回答には教育目的があり、理解できるように十分に大きくする必要があります。 「ここで、これをコピーして貼り付けます]

まず、Box レイアウトがどのように機能するかを知る必要があります。上から下 (PAGE_AXIS) と左から右 (LINE_AXIS) の 2 種類の AXIS (コンポーネントを追加して配置する方法) があります。この 2 つの軸を使用して、さまざまなレイアウトをネストすることで、必要なものをうまく作成できます。

最初に知っておくべきことは、より多くのレイアウトをネストする方法です。

レイアウトをネストするには、JPanel を使用します。それぞれに別の軸があり、別の軸が別の軸に配置されます。

ケースの分析を開始します。パネルの中央にある 3 つのボタンの上にラベルがあります。コンポーネントのある内側のパネルから始めることができます。以下を含む PAGE_AXIS (上から下) が必要です。

// +---------------------+
// |     white space     |
// |                     |
// + - - - - - - - - - - +
// |JLABEL JLABEL  JLABEL|
// + - - - - - - - - - - +
// |     white space     |
// |_____________________|
// |       button        |
// |---------------------|
// |_____________________|
// |       button        |
// |---------------------|
// |_____________________|
// |       button        |
// |---------------------|
// |     white space     |
// +---------------------+

Panel がコンポーネントの幅に合わせて調整されていることがわかるように、BoxLayout がコンポーネントに最大サイズを与えることを好むというトリックがあります。この場合、マージンがないため、左右のマージンを設定するために、LINE_AXIS を使用して外部の別の JPanel が必要です。結果は次のようになります。

// +---+---------------------+---+
// |   |     white space     |   |
// |   |                     |   |
// |   + - - - - - - - - - - +   |
// | W |JLABEL JLABEL  JLABEL| W |
// | H + - - - - - - - - - - + H |
// | I |     white space     | I |
// | T  _____________________  T |
// | E |       button        | E |   
// |    ---------------------    |
// | S  _____________________  S |
// | P |       button        | P |   
// | A  ---------------------  A |
// | C  _____________________  C |
// | E |       button        | E |   
// |    ---------------------    |
// |   |     white space     |   |
// +-----------------------------+

したがって、最初に知っておく必要があるのは、各パネルのレイアウトを設定することです。

// Initializing
JPanel outside = new JPanel();
JPanel inside = new JPanel();

// setting a layout with horizontal alignment
outside.setLayout(new BoxLayout(outside, BoxLayout.LINE_AXIS));
// setting a layout with vertical alignment
inside.setLayout(new BoxLayout(inside, BoxLayout.PAGE_AXIS));

これが完了したら、パネルを埋める必要があります。外から始めます。部外者は (私のイメージを見て) 最初に水平スペース、次に内側パネル、次に別の水平スペースを必要とします。それらを追加します。

// create an horizontal space of 20px
outside.add(Box.createHorizontalStrut(20));
outside.add(inside);
outside.add(Box.createHorizontalStrut(20));

次に、内側に移動します。大きな空白、ラベル、別の白、ボタン、小さな白、ボタン、小さな白、3 つ目のボタン、大きな白が必要です。これでパネルの内側を埋めていきます。

// create a vertical space of 20px
inside.add(Box.createVerticalStrut(20));

JLabel title = new JLabel("THE TITLE");
inside.add(title);

inside.add(Box.createVerticalStrut(20);

JButton btt1 = new JButton("BUTTON ONE");
// create a new dimension object
Dimension d = new Dimension(200,40);
// set the four kind of size, the button CANNOT be different than the dimension I choose
btt1.setSize(d);
btt1.setMinimumSize(d);
btt1.setMaximumSize(d);
btt1.setPreferredSize(d);
JButton btt2 = new JButton("BUTTON TWO");
btt2.setSize(d);
btt2.setMinimumSize(d);
btt2.setMaximumSize(d);
btt2.setPreferredSize(d);
JButton btt3 = new JButton("BUTTON THREE");
btt3.setSize(d);
btt3.setMinimumSize(d);
btt3.setMaximumSize(d);
btt3.setPreferredSize(d);

// Now that the button are ready we put them in the panel.
inside.add(btt1);
inside.add(Box.createVerticalStrut(5));
inside.add(btt2);
inside.add(box.createVerticalStrut(5));
inside.add(btt3);

// Last white space, the bottom margin:
inside.add(Box.createVerticalStrut(20));

これで、構造が完全にセットアップされました。見えるようにするだけで、すべて完了です。もちろん、JFrame または JDialog に配置する必要があります。もちろん、BoxLayout は任意のコンポーネントに設定できるため、最初のパネルは JFrame または JDialog にすることができます。

この基本的なチュートリアルで、この種の構造のプログラミングの基本を理解していただければ幸いです。しかし、さらに複雑にするためには、これを読む必要があります: http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html http://docs.oracle.com/javase /tutorial/uiswing/layout/box.html

ごきげんよう。

于 2012-10-11T10:07:41.393 に答える
4

レイアウトは信じられないほど強力で時間を節約できます... Delphi や VB などの他の言語から来ているので、Swing の最高の機能の 1 つはレイアウト マネージャーだと言えます。

ここに画像の説明を入力

public class TestLayout06 {

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

    public TestLayout06() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

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

    protected class MenuPanel extends JPanel {

        public MenuPanel() {            
            JLabel label = new JLabel("Menu");
            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            add(label, gbc);

            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.gridy++;
            add(new JButton("Option 1"), gbc);
            gbc.gridy++;
            add(new JButton("Option 2"), gbc);
            gbc.gridy++;
            add(new JButton("Option 3"), gbc);
        }
    }
}

を見てみましょう

于 2012-10-11T10:25:25.867 に答える