Трудности с GridBagLayout

Бих искал да оформя компоненти, както е показано на снимката, само с помощта на GridBagLayout.
Опитах няколко ограничения, но никога не се стигна до очаквания резултат, така че се чудя дали наистина е възможно само с GridBagLayout. Трудността е за компонентите C1, C2 и C3.
C1 и C2 са JComponent, които ще задържат други компоненти вътре като JPanel. Задал съм техния минимален и предпочитан размер. C3 е JButton.
C1 не трябва да заема допълнително място, затова зададох теглото му x на 0 и ширината на мрежата на 1 (пробвах и с 2, тъй като обхваща C2 и C3).
C2 заема цялото допълнително пространство, зададох теглото му x на 1 и ширината на мрежата на 3.
GUI не може да се преоразмерява.
Използвах този LayoutManager няколко пъти, но все още не го овладявам, благодаря ви за малко помощ.

GridBagLayout


person jerome    schedule 30.11.2012    source източник
comment
1) Добавете някакъв контекст към области C1, 2 и 3. Какво има в тези области? 2) Трябва ли да може да се променя размера? Къде трябва да се присвои допълнително пространство и височина на GUI?   -  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