Сложности GridBagLayout

Я хотел бы расположить компоненты, как показано на рисунке, только с использованием GridBagLayout.
Я пробовал несколько ограничений, но это никогда не приводило к ожидаемому результату, поэтому я задаюсь вопросом, действительно ли это возможно только с GridBagLayout. Сложность заключается в компонентах C1, C2 и C3.
C1 и C2 — это JComponent, которые будут содержать внутри другие компоненты, такие как JPanel. Я установил их минимальный и предпочтительный размер. C3 - это JButton.
C1 не должен занимать дополнительное пространство, поэтому я установил его weightx равным 0, а ширину сетки равным 1 (пробовал также с 2, так как он охватывает C2 и C3).
C2 занимает все дополнительное пространство, я установил его вес x равен 1, а ширина сетки равна 3.
Размер графического интерфейса нельзя изменить.
Я использовал этот LayoutManager несколько раз, но все еще не освоил его, спасибо за небольшую помощь.

GridBagLayout


person jerome    schedule 30.11.2012    source источник
comment
1) Поместите некоторый контекст в области C1, 2 и 3. Что находится в этих областях? 2) Должен ли он изменять размер? Где дополнительное пространство и высота должны быть назначены графическому интерфейсу?   -  person Andrew Thompson    schedule 30.11.2012
comment
правильно (как упомянул @Andrew Thompson), нужно поместить туда невидимые JComponents или JLabel, но нужно правильно установить GBC, или вы можете создать матрицу (взять наименьшее измерение) JLabels вверху, а затем использовать только числа GBC колонки для этого   -  person mKorbel    schedule 30.11.2012


Ответы (2)


  • Я буду говорить только о GridBagLayout, даже это может быть работа именно для MigLayout (у MigLayout есть дополнительный параметр для заполнения количества столбцов и строк, изменения размера и т. д.) и/или TableLayout(???)

  • GridBagLayout требуется только заполнение всех желаемых номеров столбцов в первой строке (только), затем создается матрица, и вы можете определить любые GBC weightx, weighty, gridx, gridy и/или с Anchor тоже

  • пример говорящий о

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

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 GbcLayout {

    private JFrame frame = new JFrame("GbcLayoutGbcLayout");
    private JPanel panel = new JPanel();
    private JLabel hidelLabel;
    private JLabel firstLabel;
    private JTextField firstText;

    public GbcLayout() {
        panel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
        for (int k = 0; k < 50; k++) {
            hidelLabel = new JLabel("     ");
            hidelLabel.setOpaque(true);
            hidelLabel.setBackground(Color.orange);
            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);
        }
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                GbcLayout gbcl = new GbcLayout();
            }
        });
    }
}
person mKorbel    schedule 30.11.2012

Боюсь, это невозможно. GridBagLayout не может определить правильное расстояние между началом C1 и началом C3.

person StanislavL    schedule 30.11.2012