Как «эмулировать» сетку из 12 столбцов в Java Swing с помощью GridBagLayout - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь расположить компоненты Java Swing в сетке из 12 столбцов, подобно тому, как это делается в CSS при веб-разработке.

Я пробовал следующее:

package com.example.test;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class AddressWindow extends JFrame {

    public AddressWindow() {

        JLabel addressTypeLabel = new JLabel("Type");
        JLabel addressLineLabel = new JLabel("Address");
        JLabel zipLabel = new JLabel("ZIP");
        JLabel townLabel = new JLabel("Town");
        JLabel countyLabel = new JLabel("County");
        JLabel stateLabel = new JLabel("State");
        JLabel countryLabel = new JLabel("Country");

        JComboBox addressType = new JComboBox();
        JTextField addressLine1 = new JTextField();
        JTextField addressLine2 = new JTextField();
        JTextField zip = new JTextField();
        JTextField town = new JTextField();
        JTextField county = new JTextField();
        JTextField state = new JTextField();
        JTextField country = new JTextField();

        GridBagLayout windowLayout = new GridBagLayout();
        setLayout(windowLayout);
        GridBagConstraints c = new GridBagConstraints();  
        c.fill = GridBagConstraints.HORIZONTAL; 
        c.weightx = 1.0;

        // First Row 
        int posy = 0; c.gridy = posy;

        c.gridx = 1;
        c.gridwidth = 2;
        add(addressTypeLabel, c);

        c.gridx = 3;
        c.gridwidth = 4;
        add(addressType, c);

        c.gridx = 7;
        c.gridwidth = 2;
        add(countryLabel, c);

        c.gridx = 9;
        c.gridwidth = 4;
        add(country, c);

        // Next Row
        posy++; c.gridy = posy;

        c.gridx = 1;
        c.gridwidth = 2;
        add(addressLineLabel, c);

        c.gridx = 3;
        c.gridwidth = 10;
        add(addressLine1, c);

        posy++; c.gridy = posy;

        c.gridx = 3;
        c.gridwidth = 10;
        add(addressLine2, c);

        // Next Row
        posy++; c.gridy = posy;

        c.gridx = 1;
        c.gridwidth = 2;
        add(zipLabel, c);

        c.gridx = 3;
        c.gridwidth = 4;
        add(zip, c);

        c.gridx = 7;
        c.gridwidth = 2;
        add(townLabel, c);

        c.gridx = 9;
        c.gridwidth = 4;
        add(town, c);

        // Next Row
        posy++; c.gridy = posy;

        c.gridx = 1;
        c.gridwidth = 2;
        add(countyLabel, c);

        c.gridx = 3;
        c.gridwidth = 4;
        add(county, c);

        c.gridx = 7;
        c.gridwidth = 2;
        add(stateLabel, c);

        c.gridx = 9;
        c.gridwidth = 4;
        add(state, c);

        setSize(400,200);
        setVisible(true);

    }

    public static void main(String[] args) {  

        AddressWindow f = new AddressWindow();

    }

}

Хотя это создает сетку, ширина компонента (столбца) не учитывается, так как она дает одинаковую ширину каждому компоненту. Я явно не понимаю, как работает gridwidth.

Предполагаемый эффект будет состоять в том, что из воображаемых меток сетки из 12 столбцов потребуется 2 столбца и элементы типа ввода 4, что составит сетку столбцов 2 + 4 + 2 + 4 = 12 (за исключением addressLine1 и addressLine2, где есть одна метка и поле ввода занимает 10 столбцов). I.E. Я пытаюсь сделать так, чтобы входные элементы были в два раза шире, чем их соответствующие метки.

Это результат:

Result

1 Ответ

0 голосов
/ 24 апреля 2019

Предполагаемый эффект будет таким, что из воображаемых 12 столбцов

Вы не можете просто составлять столбцы.

Размер столбца определяется «предпочтительным размером» компонентов, отображаемых в столбце.

Максимальное количество компонентов в каждой строке равно 4, поэтому у вас может быть максимум 4 столбца.

Поэтому, когда вы создаете свои JTextFields, вы должны делать что-то вроде:

JTextField textField = new JTextField(10);

Это позволит текстовому полю определять его предпочтительный размер на основе отображения символов 10 "W".

У вас должно быть weightx = 0 для всех меток (или другое значение, отличное от 1,0). Это означает, что метки не получат дополнительное пространство при изменении размера рамки, что позволяет увеличивать текстовые поля.

Для адресных строк вы должны использовать gridwidth = 3, чтобы он занимал последние 3 столбца.

...