Я пытаюсь расположить компоненты 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](https://i.stack.imgur.com/ifbnm.png)