【发布时间】:2019-04-24 17:58:38
【问题描述】:
我正在尝试将 Java Swing 组件放置在 12 列网格中,类似于 Web 开发中的 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 列)。 IE,我正在尝试使输入元素的宽度是其各自标签的两倍。
这是结果:
【问题讨论】:
-
以最小尺寸提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图,如果可调整大小,则具有更大的宽度和高度 - 以显示额外空间应该如何使用。
标签: java swing layout-manager gridbaglayout