1

これが私が実際にパネルに置きたいものです:

最初の論理ブロック:

ラジオボタン1テキストフィールドアイコンボタン

ラジオボタン2テキストフィールドアイコンボタン

チェックボックス

2番目の論理ブロック:

ラベルスピナー

        ボタン

私の最初の決定は、垂直ボックスレイアウトを作成し、論理ブロックごとに2つの水平ボックスレイアウトを配置することです。しかし、問題はこれらのブロックにあります。この構造を説明するためにどのレイアウトを選択するのでしょうか。私はGridBagLayoutが嫌いです-それは非常に複合的で理解するのが難しいです、特にコードがあなたのものでないとき。今のところ、フローレイアウトとグリッドレイアウトを使用できることがわかります。ただし、たとえば、グリッドレイアウトでは、ボタンがセルの幅まで拡大され、ボタンにアイコンのみが付いている場合、非常に奇妙に見えます。

あなたが私に何かアドバイスできることを願っています。

4

1 に答える 1

6

最初のケースでは、単純なGridLayoutonJPanelを使用でき、それぞれに制約3 Rowsのある個別のJPanelがあります。このコード例を見てください:FlowLayoutFLowLayout.LEFT

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

public class ExampleLayout
{
    private void displayGUI()
    {
        JFrame frame = new JFrame("Example Layout");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new GridLayout(0, 1, 5, 5));

        JPanel topPanel = new JPanel();
        topPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));

        JRadioButton rbut1 = new JRadioButton("RadioButton 1", false);
        JTextField tfield1 = new JTextField(10);
        JButton button1 = new JButton("Button 1");

        topPanel.add(rbut1);
        topPanel.add(tfield1);
        topPanel.add(button1);

        JPanel middlePanel = new JPanel();
        middlePanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));

        JRadioButton rbut2 = new JRadioButton("RadioButton 2", false);
        JTextField tfield2 = new JTextField(10);
        JButton button2 = new JButton("Button 2");

        middlePanel.add(rbut2);
        middlePanel.add(tfield2);
        middlePanel.add(button2);

        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        JCheckBox cbox = new JCheckBox("CheckBox 1", false);
        bottomPanel.add(cbox);

        contentPane.add(topPanel);
        contentPane.add(middlePanel);
        contentPane.add(bottomPanel);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new ExampleLayout().displayGUI();
            }
        });
    }
}

出力:

最初のブロック

JPanel2番目のケースでは、最初の2つのコンポーネントをデフォルトのレイアウトに追加するだけです。そして、3番目のコンポーネントについては、制約なしで、単にコンポーネントをJPanelhavingに追加します。GridBagLayout

編集#1:

または、 2番目のブロックにこのアプローチを使用できます。

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

public class ExampleLayout
{
    private void displayGUI()
    {
        JFrame frame = new JFrame("Example Layout");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(5, 5));

        JPanel basePanel = new JPanel();
        basePanel.setLayout(new GridLayout(0, 1, 5, 5));

        JPanel topPanel = new JPanel();
        //topPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));

        JLabel label1 = new JLabel("Label 1", JLabel.CENTER);
        JRadioButton rbut1 = new JRadioButton("RadioButton 1", false);

        topPanel.add(label1);
        topPanel.add(rbut1);        

        JPanel middlePanel = new JPanel();
        middlePanel.setLayout(new GridBagLayout());

        JButton button1 = new JButton("Button 1");

        middlePanel.add(button1);

        basePanel.add(topPanel);
        basePanel.add(middlePanel);

        contentPane.add(basePanel, BorderLayout.PAGE_START);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new ExampleLayout().displayGUI();
            }
        });
    }
}
于 2013-01-30T11:54:51.480 に答える