【问题标题】:How to "emulate" a 12 column grid in Java Swing using GridBagLayout如何使用 GridBagLayout 在 Java Swing 中“模拟”一个 12 列网格
【发布时间】: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


【解决方案1】:

预期的效果将是在假想的 12 列中

你不能只是编列。

列的大小由列中显示的组件的“首选大小”确定。

您在任何行中的最大组件数为 4,因此您最多有 4 列。

因此,当您创建 JTextFields 时,您应该执行以下操作:

JTextField textField = new JTextField(10);

这将允许文本字段根据显示 10 个“W”字符来确定其首选大小。

您应该为所有标签使用weightx = 0(或其他值而不是 1.0)。这意味着标签不会在调整框架大小时获得额外空间,从而允许文本字段增长。

对于地址行,您应该使用gridwidth = 3,因此它跨越最后 3 列。

【讨论】:

    猜你喜欢
    • 2021-01-10
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多