7

見栄えを良くするには、含まれているJFrameの水平方向の中央に配置する必要があるJButton(「OK」ボタン)を設計しようとしています。
自由形式レイアウト(GroupLayout)でGUIビルダーを使用しています。

いくつかのGUIビルダーチュートリアル(http://netbeans.org/kb/docs/java/quickstart-gui.html)を受講しましたが、このトピックは見つかりませんでした。他のGUIビルダー(デルファイ)では、これは両端からアンカーを削除することで実行できます。

4

5 に答える 5

6

GroupLayoutコンポーネントのセンタリングをサポートします。それは非常に有能なレイアウトマネージャーです。個人的にはマネージャーの後、MigLayoutマネージャーの前に置いていFormLayoutます。

次の3つの例では、パネルとボタンがあります。ボタンは水平方向の中央に配置されます。

NetBeansBuilderを使用したセンタリング

Netbeans Builderを使用してコンポーネントを中央に配置するには、ボタンの両側からサイズ変更可能な水平方向のギャップを作成する必要があります。

スクリーンショットの緑色の領域は、現在選択されているギャップです。ギャップ内の文字列は、それがサイズ変更可能なギャップであることを示しています。

NetBeansのスクリーンショット

フォームにコンポーネントを配置すると、ギャップが自動的に追加されます。サイズ変更可能なギャップを定義するには、ギャップを右クリックして[レイアウトスペースの編集]オプションを選択します。次のダイアログが表示されます。

NetBeansのスクリーンショット

サイズ変更可能なギャップを取得するには、[サイズ変更可能]チェックボックスをオンにします。

並列グループを使用して手動でセンタリングする

パラメータを渡すことにより、コンポーネントを並列グループの中央に配置できGroupLayout.Alignment.CENTERます。

package com.zetcode;

import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import static javax.swing.GroupLayout.Alignment.CENTER;
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GroupLayoutCenter extends JFrame {

    public GroupLayoutCenter() {

        initUI();

        setTitle("Centered button");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);        
    }

    private void initUI() {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);    

        gl.setAutoCreateGaps(true);
        gl.setAutoCreateContainerGaps(true);

        JPanel pnl = new JPanel();
        pnl.setBorder(BorderFactory.createEtchedBorder());

        JButton btn = new JButton("Button");

        gl.setHorizontalGroup(gl.createParallelGroup(CENTER)
           .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
           .addComponent(btn)
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
           .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
           .addComponent(btn)            
        );          

        pack();
    }


    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                GroupLayoutCenter ex = new GroupLayoutCenter();
                ex.setVisible(true);
            }
        });
    }
}

ギャップを使用して手動でセンタリングする

このソリューションは、NetBeansで生成されたコードが行うことです。ボタンの左側と右側に2つのサイズ変更可能なギャップを配置します。

package com.zetcode;

import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GroupLayoutCenter2 extends JFrame {

    public GroupLayoutCenter2() {

        initUI();

        setTitle("Centered button");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);        
    }

    private void initUI() {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);    

        gl.setAutoCreateGaps(true);
        gl.setAutoCreateContainerGaps(true);

        JPanel pnl = new JPanel();
        pnl.setBorder(BorderFactory.createEtchedBorder());

        JButton btn = new JButton("Button");

        gl.setHorizontalGroup(gl.createParallelGroup()
                .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
                .addGroup(gl.createSequentialGroup()
                        .addGap(5, 100, Short.MAX_VALUE)
                        .addComponent(btn)
                        .addGap(5, 100, Short.MAX_VALUE))
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
                .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
                .addComponent(btn)
        );    

        pack();
    }


    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                GroupLayoutCenter2 ex = new GroupLayoutCenter2();
                ex.setVisible(true);
            }
        });
    }
}

ここに画像の説明を入力してください

于 2014-08-06T22:30:33.190 に答える
5

コンテナのサイズが変更された場合にコンポーネントをコンテナの中央に配置したい場合は、いくつかのオプションを利用できますが、GroupLayoutはその1つではないと思います(間違っている場合は修正してください)。1つの方法は、コンテナーのレイアウトをGridBagLayoutに変更してから、制約なしでJButtonをコンテナーに追加することです。

于 2011-10-10T10:56:31.733 に答える
2

これを見てみてGridbagLayoutください

于 2011-10-10T11:12:13.463 に答える
2

別のLayoutManagerを試してください!NetBeansによって生成されたコードを見るだけでは、GroupLayoutは非常にわかりにくいです。

DesignGridLayoutを使用した場合、必要なものは次のように単純です。

DesignGridLayout layout = new DesignGridLayout(container);
layout.row().center().add(okButton);
于 2011-10-10T12:33:08.453 に答える
2

javax.swing.Box.FillerGroupLayout内のコンポーネントの周囲にスペースを埋めるために使用できます。NetBeans Matisse(GUI Builder)では、パレットの「SwingFillers」セクションの下で「Horizo​​ntalStrut」と呼ばれます。ボタンのいずれかの側に1つ配置し、ボタンとコンテナの端の間のすべての空きスペースを埋めるようにサイズを変更し、両方に[水平方向に自動サイズ変更]のフラグが設定されていることを確認します。

別のLayoutManagerを使用することに関しては、手動でコーディングするのに役立たないため、人々がGroupLayoutを好まないことを私は知っています。これは仕様によるものです。ドキュメントにあるように、GroupLayoutはGUIビルダーが使用することを目的としています。GUIの存続期間中、NetBeansとMatisseを使用することに問題がない限り、GroupLayoutは本当に最良のオプションです。

于 2012-03-26T19:09:58.663 に答える