9

ここに画像の説明を入力

上記のようなGUIを作りたいと思います。現在、名前ラベル、名前テキストフィールド、生年月日ラベル、誕生日テキストフィールドを保持するパネルがあります。私の質問は、「名前コンポーネント」の行 (ラベル + テキストフィールド) と「生年月日コンポーネント」の行 (ラベル + テキストフィールド) が垂直方向に均等に広がるように、パネルで使用するのに最適なレイアウトマネージャーは何かということです。パネル。

フロー レイアウトを使用することも考えましたが、2 列のコンポーネントの間に隙間ができません。グリッドレイアウトを考えたのですが、2列の部品の隙間の大きさがわかりません。

より複雑なアプローチ...名前ラベルとテキストフィールドを1つのパネルに配置し、生年月日のラベルとテキストフィールドを別のパネルに配置してから、ベースパネルのボーダーレイアウトを作成し、名前を北、生年月日を南に設定することを考えました。 ..しかし、名前コンポーネントが名前パネルの垂直方向の中央に配置され、生年月日のコンポーネントが生年月日パネルの垂直方向の中央に配置されていることを確認する必要があります。

どんな助けでも大歓迎です。目標は、名前コンポーネントの行と生年月日コンポーネントの行が垂直方向に広がり、名前コンポーネントが上半分の垂直方向の中央に配置され、生年月日のコンポーネントが下半分の垂直方向の中央に配置されるようにすることです。わかりにくい点があればお知らせください。理解を深めるために言い換えてみます。

私はEclipseで厳密にJavaスイングを使用しており、GUIビルダーなどは使用していません。

4

4 に答える 4

9

私はMigLayoutが好きです。その場合、MigLayout にはテーブルのような動作があり、コンポーネントはそのように配置されるため、コンポーネントのレイアウトは非常に簡単です。これについては、QuickStartGuideで説明されています。

編集:

以下に小さな例を示します。

ここに画像の説明を入力

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;

public class Test {

    private JFrame frame;
    private JTextField nameTextField, birthDateTextField;
    private JLabel nameLabel, birthDateLabel;

    public Test() {
        initComponents();
    }

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

    private void initComponents() {
        frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new MigLayout());

        nameTextField = new JTextField(30);
        birthDateTextField = new JTextField(30);
        nameLabel = new JLabel("Name:");
        birthDateLabel = new JLabel("Birth Date:");

        frame.add(nameLabel);
        frame.add(nameTextField, "wrap");
        frame.add(birthDateLabel);
        frame.add(birthDateTextField);
        frame.pack();
        frame.setVisible(true);
    }
}
于 2012-11-28T23:31:38.003 に答える
3

レイアウト マネージャーによって自動化されるように設計されたレイアウトには近づかないことを強くお勧めします。レイアウトは柔軟ですが、ハンマーとして使用される傾向があります。自然な方法。

レイアウト マネージャーの使い方を学ぶのはちょっとした芸術です。1 つだけを選択してすべての問題に使用するのではなく、いくつかの異なるタイプを使用して、データのようにネストします。

あなたの場合、3つのフローレイアウト、1つの垂直に2つの水平が含まれているとかなりうまくいくと思います。そのようなGUIはまさにflowLayoutが作成されたものであり、パラメーターをいじる必要はありません。

ところで、Border と Flow レイアウトをネストすることで、多くの問題を解決できます。Border は、中央が可能な限り多くのスペースを占有するように機能し、4 つの側面は必要なだけスペースを残すため、非常に便利です。 -実際、BorderLayout は多くの場合、塗りつぶされた領域が 2 つまたは 3 つしかありませんが、他の Border レイアウトまたはフロー レイアウトを簡単にネストできます。これらは、配置の詳細をほとんど必要としない GUI につながりますが、それでも自然にサイズ変更されます。

編集: これは、ボックス レイアウトにネストされた 2 つのフロー レイアウトの作業コードです。

これは (Java ではなく) グルーヴィーですが、違いは純粋に構文です。

シンプルで、発明する数が少ないことに注意してください。これは、期待どおりに機能します。

import javax.swing.*
java.awt.* をインポート

f=新しい JFrame()
f.setSize(300,200)
p=f.getContentPane()
p.setLayout(新しい BoxLayout(p, BoxLayout.Y_AXIS))
p.add(panel("ボタン 1"))
p.add(panel("ボタン 2"))
f.show()

ボイド addPanel(名前) {
   def child=new JPanel()
   child.add(新しい JButton(名前))
   child.add(新しい JTextField(20))
   子を返す
}
于 2012-11-28T23:24:01.400 に答える
2

私は個人的に好きGridBagLayoutです。

以下に例を示します。

ここに画像の説明を入力

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class Test {

    private JFrame frame;
    private JTextField nameTextField, birthDateTextField;
    private JLabel nameLabel, birthDateLabel;

    public Test() {
        initComponents();
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                        if ("Nimbus".equals(info.getName())) {
                            UIManager.setLookAndFeel(info.getClassName());
                            break;
                        }
                    }
                } catch (Exception e) {
                    // If Nimbus is not available, you can set the GUI to another look and feel.
                }
                new Test();
            }
        });
    }

    private void initComponents() {
        frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridBagLayout());

        nameTextField = new JTextField(30);
        birthDateTextField = new JTextField(30);
        nameLabel = new JLabel("Name:");
        birthDateLabel = new JLabel("Birth Date:");

        GridBagConstraints gc = new GridBagConstraints();
        gc.fill = GridBagConstraints.HORIZONTAL;
        gc.insets = new Insets(10, 10, 10, 10);

        gc.gridx = 0;
        gc.gridy = 0;
        frame.add(nameLabel, gc);

        gc.gridx = 1;
        gc.gridy = 0;
        frame.add(nameTextField, gc);

        gc.gridx = 0;
        gc.gridy = 1;
        frame.add(birthDateLabel, gc);

        gc.gridx = 1;
        gc.gridy = 1;
        frame.add(birthDateTextField, gc);

        frame.pack();
        frame.setVisible(true);
    }
}
于 2012-11-28T23:04:56.237 に答える
1

GroupLayoutはニーズに適しています。それを見てください。ギャップを自動作成する機能があり (または自分でギャップを管理できます)、フォームの作成に最適です。水平または垂直のいずれかで機能します。

于 2012-11-28T23:06:27.563 に答える