Как создать Java GridBagLayout с шестью строками и 2 столбцами

#java #swing #user-interface #gridbaglayout

#java #swing #пользовательский интерфейс #gridbaglayout

Вопрос:

Я устал от Java GridBagLayout. Я хочу создать панель, похожую на ту, что показана на рисунке ниже, но я не смог ее получить. Я не могу расположить левую панель, и мне не удалось сделать панели длинными. Ширина не увеличивается, когда я устанавливаю gridWidth. Я не могу использовать для этого никаких разработчиков графического интерфейса. Я хочу получить макет, подобный изображению ниже.

введите описание изображения здесь

Это неудачный код:

 public class gui3 extends Frame{
    Panel p1,p2,p3,p4,p5,p6,p7,pmain;
    gui3(){

    setVisible(true);
    setSize(500,500);
    setTitle(" Calculator ");


        GridBagLayout gb1=new GridBagLayout();
        GridBagConstraints gbc=new GridBagConstraints();
        setLayout(gb1);

        p1=new Panel();
        p1.setBackground(Color.BLACK);
        gbc.gridx=5;
        gbc.gridy=0;
        gbc.gridwidth=3;
        //gbc.weightx =0.5;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p1,gbc);

        p2=new Panel();
        p2.setBackground(Color.BLUE);
        gbc.gridx=0;
        gbc.gridy=1;
        gbc.gridwidth=2;
       // gbc.weightx = 1;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p2,gbc);

        p3=new Panel();
        p3.setBackground(Color.GREEN);
        gbc.gridx=0;
        gbc.gridy=2;
        gbc.gridwidth=2;
      //  gbc.weightx = 1;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p3,gbc);

        p4=new Panel();
        p4.setBackground(Color.cyan);
        gbc.gridx=0;
        gbc.gridy=3;
        gbc.gridwidth=2;
      //  gbc.weightx = 1;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p4,gbc);

        p5=new Panel();
        p5.setBackground(Color.RED);
        gbc.gridx=0;
        gbc.gridy=4;
        gbc.gridwidth=2;
     //   gbc.weightx = 1;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p5,gbc);

        p6=new Panel();
        p6.setBackground(Color.pink);
        gbc.gridx=0;
        gbc.gridy=5;
        gbc.gridwidth=2;
       // gbc.weightx = 1;
       // gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p6,gbc);

        p7=new Panel();
        p7.setBackground(Color.yellow);
        gbc.gridx=6;
        gbc.gridy=0;
        gbc.gridheight=6;
     //   gbc.weightx = 1;
        gbc.fill=GridBagConstraints.HORIZONTAL;
        add(p7,gbc);


    }

}
 

Комментарии:

1. GBC основаны на столбцах, затем для создания матрицы с 6/7 столбцами и 6 строками

2. все зависит от того, будет ли / как он будет изменяться

Ответ №1:

Вы имеете в виду что-то вроде…

Макет

Таким образом, в принципе, вы можете использовать GridBagConstraints#gridheight (или gridwidth ) для установки количества ячеек сетки, которые будет охватывать компонент

 import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestLayout {

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

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

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.insets = new Insets(4, 4, 4, 4);
                gbc.gridx = 0;
                gbc.weightx = 1;
                gbc.gridy = 0;
                gbc.fill = GridBagConstraints.HORIZONTAL;
                frame.add(createPane(Color.RED), gbc);
                gbc.gridy  ;
                frame.add(createPane(Color.GREEN), gbc);
                gbc.gridy  ;
                frame.add(createPane(Color.BLUE), gbc);
                gbc.gridy  ;
                frame.add(createPane(Color.CYAN), gbc);
                gbc.gridy  ;
                frame.add(createPane(Color.MAGENTA), gbc);
                gbc.gridy  ;
                frame.add(createPane(Color.ORANGE), gbc);
                gbc.gridy  ;
                frame.add(createPane(Color.PINK), gbc);

                gbc.gridx  ;
                gbc.weightx = 0;
                gbc.gridy = 0;
                gbc.weighty = 1;
                gbc.gridheight = GridBagConstraints.REMAINDER;
                gbc.fill = GridBagConstraints.VERTICAL;
                frame.add(createPane(Color.YELLOW), gbc);

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public JPanel createPane(Color color) {
        JPanel pane = new JPanel(){ 

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(50, 50);
            }

        };
        pane.setBackground(color);
        return pane;
    }

}
 

Посмотрите, как использовать GridBagLayout для получения более подробной информации

Комментарии:

1. конечно, это то, что я need.it это действительно полезно. но когда я изменяю размер по вертикали, строки внезапно становятся такими узкими. могу ли я избежать этого

2. Это произойдет, когда доступное пространство будет меньше предпочтительного размера компонентов. Единственный способ действительно избежать этого — поместить компонент в область прокрутки

3. Это можно легко исправить; см. Мой ответ.

4. @JanBodnar Да, молодец, ты взял проблему вне контекста и предоставил произвольное решение, которое может отрицательно повлиять на то, что на самом деле пытается сделать OP. Переопределение предпочтительных / минимальных размеров компонентов должно быть последним средством. Добавление компонентов в панели и предоставление ограничений макета было бы более универсальным решением.

5. @MadProgrammer Ну, мой пост может выглядеть как критика, но это не должно было быть. Просто эти резкие изменения часто путают новичков, когда они используют GridBagLayout. Я просто хотел сообщить, что это можно исправить двумя способами: установить минимальный размер на предпочтительный размер или правильно установить веса. Оба ИМХО действительны.

Ответ №2:

Резкие изменения размера от решения MadProgrammer можно легко исправить двумя способами:

 public JPanel createPane(Color color) {
    JPanel pane = new JPanel(){ 

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(50, 50);
        }

        @Override
        public Dimension getMinimumSize() {
            return new Dimension(50, 50);
        }            

    };
    pane.setBackground(color);
    return pane;
}
 

Мы также предоставляем минимальный размер, который равен предпочтительному размеру.
Таким образом, панели не сжимаются, но они вырезаются из окна
, когда контейнер слишком мал для их отображения.

Оптимальное решение, вероятно, установить значение weighty 1. Панели будут постепенно уменьшаться.

 gbc.weightx = 1;
gbc.weighty = 1;
gbc.gridy = 0;
 

Наконец, я также создал решение с MigLayout помощью . Если возможно, попробуйте
создавать свои макеты с MigLayout помощью, а не с GridBagLayout помощью .

 package com.zetcode;

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;


public class MigLayoutPanels extends JFrame {

    public MigLayoutPanels() {

        initUI();

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

    private void initUI() {

        setLayout(new MigLayout("wrap"));

        add(createPanel(), "w 200, push, grow");
        add(createPanel(), "push, grow");
        add(createPanel(), "push, grow");
        add(createPanel(), "push, grow");
        add(createPanel(), "push, grow");
        add(createPanel(), "push, grow");

        add(createPanel(), "cell 1 0 1 6, growy");


        pack();
    }

   public JPanel createPanel() {
        JPanel pnl = new JPanel(){ 

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(50, 50);
            }

        };

        pnl.setBorder(BorderFactory.createEtchedBorder());
        return pnl;
    }    

    public static void main(String[] args) {

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

GridBagLayout это мощный менеджер, который можно использовать для создания большинства макетов.
Многие программисты считают его сложным в использовании. MigLayout проще для понимания,
более мощный и гораздо менее подробный.

Панели