1

これは、次の質問の拡張です: Java gridbaglayout problems。パネル 1 の幅オーバーフローのため、パネル 1 がパネル 2 に重なっています。ただし、削除するgc.gridwidth = 2と panel2 が正しく配置されますが、コンボボックスも右側の元の場所に移動します。さまざまな gridbaglayout プロパティをいじっていますが、思いどおりに配置できません。

私のコードは次のとおりです。

public void createGUI()
{
   main_panel = new JPanel();
   main_panel.setLayout(new GridBagLayout());
   GridBagConstraints gc = new GridBagConstraints();

   gc.fill = GridBagConstraints.HORIZONTAL;
   gc.gridx = 0;
   gc.gridy = 0;
   gc.insets = new Insets(5, 0, 10, 0);
   main_panel.add(label, gc);

   gc.fill = GridBagConstraints.HORIZONTAL;
   gc.gridx = 1;
   gc.gridy = 0;
   gc.insets = new Insets(5, 0, 10, 0);
   main_panel.add(band_combobox, gc);

   gc.fill = GridBagConstraints.HORIZONTAL;
   gc.gridx = 0;
   gc.gridy = 1;
   gc.gridwidth = 2;
   gc.insets = new Insets(0, 0, 10, 0);
   main_panel.add(panel1, gc);

   gc.fill = GridBagConstraints.HORIZONTAL;
   gc.gridx = 1;
   gc.gridy = 1;
   gc.gridwidth = 2;
   gc.insets = new Insets(0, 0, 10, 0);
   main_panel.add(panel2, gc);

   gc.fill = GridBagConstraints.HORIZONTAL;
   gc.gridx = 0;
   gc.gridy = 2;
   gc.gridwidth = 2;
   gc.insets = new Insets(0, 0, 10, 0);
   main_panel.add(panel3, gc);
}

ここに画像の説明を入力

私はこのようなことをしようとしています:

ここに画像の説明を入力

4

4 に答える 4

2

複合レイアウトを使用してニーズを達成することを恐れないでください。ラベルとコンボ ボックスは、一番上の行に「浮かせ」たいと考えています。これは、単独で実現するのは難しいことですがGridBagLayout、別のレイアウト マネージャーを使用して別のコンテナーに追加することで実現可能です...

ここに画像の説明を入力

コンポーネントを変更すると、コンポーネントが他の列gridWidthgridHeight行に「流れる」ようになります。つまり、コンポーネントが追加されたタイミングに応じて、そのスペースを占めるコンポーネントの上または下に配置される可能性があります...

また、weightプロパティをチェックしてください。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.TitledBorder;

public class TestPane {
    private JPanel main_panel;

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

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

                createGUI();;

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

    public void createGUI() {

        main_panel = new JPanel();
        main_panel.setLayout(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        JLabel label = new JLabel("Band Directory");
        JComboBox band_combobox = new JComboBox();

        JPanel panel1 = new JPanel();
        panel1.add(new JLabel("1"));
        panel1.setBorder(new TitledBorder("Panel1"));
        JPanel panel2 = new JPanel();
        panel2.setBorder(new TitledBorder("Panel2"));
        panel2.add(new JLabel("2"));
        JPanel panel3 = new JPanel();
        panel3.setBorder(new TitledBorder("Panel3"));
        panel3.add(new JLabel("3"));

        JPanel top = new JPanel();
        top.add(label);
        top.add(band_combobox);

        gc.fill = GridBagConstraints.HORIZONTAL;
        gc.weightx = 1;
        gc.gridx = 0;
        gc.gridy = 0;
        gc.gridwidth = GridBagConstraints.REMAINDER;
        gc.insets = new Insets(5, 0, 10, 0);
        main_panel.add(top, gc);

        gc.gridwidth = 1;
        gc.weightx = 0.5;
        gc.gridx = 0;
        gc.gridy = 1;
        gc.insets = new Insets(0, 0, 10, 0);
        main_panel.add(panel1, gc);

        gc.gridx = 1;
        gc.gridy = 1;
        gc.insets = new Insets(0, 0, 10, 0);
        main_panel.add(panel2, gc);

        gc.fill = GridBagConstraints.HORIZONTAL;
        gc.weightx = 1;
        gc.gridx = 0;
        gc.gridy = 2;
        gc.gridwidth = GridBagConstraints.REMAINDER;
        gc.insets = new Insets(0, 0, 10, 0);
        main_panel.add(panel3, gc);
    }
}

GridBagLayout の使用方法を一読すると役立つ場合があります。

于 2013-05-28T09:06:43.057 に答える
2

バンド ディレクトリ ラベル、コンボ ボックス、メンバー パネル、CD リスト パネルには gridwidth = 1 を割り当て、CD パネルを gridwith = 2 として追加する必要があります。

public JPanel getComponentPanel()
{
   main_panel = new JPanel();
   main_panel.setLayout(new GridBagLayout());
   GridBagConstraints gc = new GridBagConstraints();

   gc.gridx = 0;
   gc.gridy = 0;
   gc.insets = new Insets(5, 0, 10, 0);
   main_panel.add(label, gc);

   gc.gridx = 1;
   gc.gridy = 0;
   gc.insets = new Insets(5, 10, 10, 0);
   main_panel.add(band_combobox, gc);

   gc.gridx = 0;
   gc.gridy = 1;
   gc.insets = new Insets(0, 10, 10, 0);
   panel1.setBorder(
           BorderFactory.createLineBorder(Color.BLACK));
   panel1.setMinimumSize(new Dimension(100, 50));
   panel1.setPreferredSize(new Dimension(100, 50));
   panel1.setMaximumSize(new Dimension(100, 50));
   main_panel.add(panel1, gc);

   gc.gridx = 1;
   gc.gridy = 1;
   gc.insets = new Insets(0, 10, 10, 0);
   panel2.setBorder(
           BorderFactory.createLineBorder(Color.BLACK));
   panel2.setMinimumSize(new Dimension(100, 50));
   panel2.setPreferredSize(new Dimension(100, 50));
   panel2.setMaximumSize(new Dimension(100, 50));
   main_panel.add(panel2, gc);

   gc.gridx = 0;
   gc.gridy = 2;
   gc.gridwidth = 2;
   gc.insets = new Insets(0, 10, 10, 0);
   panel3.setBorder(
           BorderFactory.createLineBorder(Color.BLACK));
   panel3.setMinimumSize(new Dimension(100, 50));
   panel3.setPreferredSize(new Dimension(100, 50));
   panel3.setMaximumSize(new Dimension(100, 50));
   main_panel.add(panel3, gc);

   return main_panel;
}
于 2013-05-28T09:18:45.953 に答える
2

これを試して :

public void createGUI()
{
   main_panel = new JPanel();
   main_panel.setLayout(new GridBagLayout());
   GridBagConstraints gc = new GridBagConstraints();

   gc.fill = GridBagConstraints.HORIZONTAL;
   gc.gridx = 0;
   gc.gridy = 0;
   gc.insets = new Insets(5, 0, 10, 0);
   main_panel.add(label, gc);

   gc.fill = GridBagConstraints.HORIZONTAL;
   gc.gridx = 1;
   gc.gridy = 0;
   gc.insets = new Insets(5, 0, 10, 0);
   main_panel.add(band_combobox, gc);

   gc.fill = GridBagConstraints.HORIZONTAL;
   gc.gridx = 0;
   gc.gridy = 1;
   gc.gridwidth = 1;
gc.weightx = 1;
gc.weighty = 1;
   gc.insets = new Insets(0, 0, 10, 0);
   main_panel.add(panel1, gc);

   gc.fill = GridBagConstraints.HORIZONTAL;
   gc.gridx = 1;
   gc.gridy = 1;
   gc.gridwidth = 1;
gc.weightx = 1;
gc.weighty = 1;
   gc.insets = new Insets(0, 0, 10, 0);
   main_panel.add(panel2, gc);

   gc.fill = GridBagConstraints.BOTH;
   gc.gridx = 0;
   gc.gridy = 2;
gc.weightx = 1;
gc.weighty = 1;
   gc.gridwidth = 2;
   gc.insets = new Insets(0, 0, 10, 0);
   main_panel.add(panel3, gc);
}

重みを設定していません。幅の設定は少し危険です。

バンドのラベルとコンボもJPanelに入れ、幅を2にして一番上に追加します。その方がずっと素敵に見えます。

私が持っている GridBagLayout チュートリアル (ブログ、プロフィール) も参照してください。

于 2013-05-28T08:57:55.250 に答える
1
  • 1 行目に列座標を作成するために必要な GBC、次にコンテナー全体のマトリックスを作成、ちらつきのないサイズ変更には緩やかなグラデーションが必要

  • 目に見えない JComponents (この場合は Borders が追加された JLabel) を contianer に配置することなく、この GBC マトリックスを仮想的に作成することは確かに可能です。

  • これは GBC を使用した AbsoluteLayout に関するもので、もう 1 つの方法は、目に見えない JComponents を使用することです。

ここに画像の説明を入力

import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class FrameAndGBC {

    private JLabel hidelLabel;
    private JLabel firstLabel;
    private JTextField firstText;
    private JFrame frame = new JFrame("Frame And GBC");

    public FrameAndGBC() {
        JPanel panel = copyTextNorthPanel();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    private JPanel copyTextNorthPanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
        for (int k = 0; k < 50; k++) {
            hidelLabel = new JLabel("     ");
            hidelLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weightx = 0.5;
            gbc.weighty = 0.5;
            gbc.gridx = k;
            gbc.gridy = 0;
            panel.add(hidelLabel, gbc);
        }
        for (int k = 0; k < 5; k++) {
            firstLabel = new JLabel("Testing Label : ", SwingConstants.RIGHT);
            firstLabel.setFont(new Font("Serif", Font.BOLD, 20));
            firstLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(0, 0, 5, 0);
            gbc.gridx = 0;
            gbc.gridwidth = 8;
            gbc.gridy = k + 1;
            panel.add(firstLabel, gbc);
        }
        for (int k = 0; k < 5; k++) {
            firstText = new JTextField("Testing TextField");
            firstText.setFont(new Font("Serif", Font.BOLD, 20));
            firstText.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(0, 0, 5, 0);
            gbc.gridx = 9;
            gbc.gridwidth = k + 8;
            gbc.gridy = k + 1;
            panel.add(firstText, gbc);
        }
        for (int k = 0; k < 5; k++) {
            firstLabel = new JLabel("Testing Label : ", SwingConstants.RIGHT);
            firstLabel.setFont(new Font("Serif", Font.BOLD, 20));
            firstLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(0, 0, 5, 0);
            gbc.gridx = 20 + k;
            gbc.gridwidth = 8;
            gbc.gridy = k + 1;
            panel.add(firstLabel, gbc);
        }
        for (int k = 0; k < 5; k++) {
            firstText = new JTextField("Testing TextField");
            firstText.setFont(new Font("Serif", Font.BOLD, 20));
            firstText.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(0, 0, 5, 0);
            gbc.gridx = 29 + k;
            gbc.gridwidth = 21 - k;
            gbc.gridy = k + 1;
            panel.add(firstText, gbc);
        }
        return panel;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                FrameAndGBC fs = new FrameAndGBC();
            }
        });
    }
}
于 2013-05-28T10:29:33.373 に答える