Java 仅使用一列时,使组件跨GridBagLayout中的多行

Java 仅使用一列时,使组件跨GridBagLayout中的多行,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,下面,你可以看到一个简单的例子,我试图画泰国国旗: 这面旗帜有一个特点。蓝线比其他线大两倍: public class GridBagLayoutTest { private static final Insets insets = new Insets(0, 0, 0, 0); public static void main(String args[]) { final JFrame frame = new JFrame("Make a component span mult

下面,你可以看到一个简单的例子,我试图画泰国国旗:

这面旗帜有一个特点。蓝线比其他线大两倍:

public class GridBagLayoutTest {

private static final Insets insets = new Insets(0, 0, 0, 0);


public static void main(String args[]) {

    final JFrame frame = new JFrame("Make a component span multiple rows in GridBagLayout when using only one column");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new GridBagLayout());

    JPanel row1 = new JPanel();
    row1.setBackground(new Color(237, 27, 36));

    JPanel row2 = new JPanel();
    row2.setBackground(Color.WHITE);

    JPanel row3 = new JPanel();
    row3.setBackground(new Color(26, 29, 80));

    JPanel row4 = new JPanel();
    row4.setBackground(Color.WHITE);

    JPanel row5 = new JPanel();
    row5.setBackground(new Color(237, 27, 36));

    //We are trying to draw Flag of Thailand
    addComponent(frame, row1, 0, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
    addComponent(frame, row2, 0, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
    addComponent(frame, row3, 0, 2, 1, 2, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
    addComponent(frame, row4, 0, 4, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
    addComponent(frame, row5, 0, 5, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);


    frame.setSize(500, 200);
    frame.setVisible(true); 

}


private static void addComponent(Container container, Component component, int gridx, int gridy,
  int gridwidth, int gridheight, int anchor, int fill) {
    GridBagConstraints gbc = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, 1.0, 1.0,
                                                    anchor, fill, insets, 0, 0);
    container.add(component, gbc);
}


}
我不想使用GridBagConstraint的ipady属性,因为我想在调整帧大小时保持相同的行为。 第三行(蓝色)的高度必须始终是其他行的两倍

我正在使用gridheight属性。对于蓝线,我将值2放在这个属性上,但什么也没发生

为了达到这个目标,你有什么想法吗?

给你

使用GridBagLayout时,对Swing组件大小的唯一控制是使用weightx和weighty参数

我对您的代码做了一些更改,主要是为了排除其他问题

这是密码

package com.ggl.testing;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GridBagLayoutTest implements Runnable {

    private static final Insets insets = new Insets(0, 0, 0, 0);

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new GridBagLayoutTest());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame(
                "Make a component span multiple rows in GridBagLayout when using only one column");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createFlag());
        frame.pack();
        frame.setVisible(true);

    }

    private JPanel createFlag() {
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());
        panel.setPreferredSize(new Dimension(450, 300));

        JPanel row1 = new JPanel();
        row1.setBackground(new Color(237, 27, 36));

        JPanel row2 = new JPanel();
        row2.setBackground(Color.WHITE);

        JPanel row3 = new JPanel();
        row3.setBackground(new Color(26, 29, 80));

        JPanel row4 = new JPanel();
        row4.setBackground(Color.WHITE);

        JPanel row5 = new JPanel();
        row5.setBackground(new Color(237, 27, 36));

        // We are trying to draw Flag of Thailand
        int gridy = 0;
        addComponent(panel, row1, 0, gridy++, 1, 1, 1D, 1D,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH);
        addComponent(panel, row2, 0, gridy++, 1, 1, 1D, 1D,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH);
        addComponent(panel, row3, 0, gridy++, 1, 1, 1D, 2D,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH);
        addComponent(panel, row4, 0, gridy++, 1, 1, 1D, 1D,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH);
        addComponent(panel, row5, 0, gridy++, 1, 1, 1D, 1D,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH);

        return panel;
    }

    private void addComponent(Container container, Component component,
            int gridx, int gridy, int gridwidth, int gridheight,
            double weightx, double weighty, int anchor, int fill) {
        GridBagConstraints gbc = new GridBagConstraints(gridx, gridy,
                gridwidth, gridheight, weightx, weighty, anchor, fill, insets,
                0, 0);
        container.add(component, gbc);
    }

}
给你

使用GridBagLayout时,对Swing组件大小的唯一控制是使用weightx和weighty参数

我对您的代码做了一些更改,主要是为了排除其他问题

这是密码

package com.ggl.testing;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GridBagLayoutTest implements Runnable {

    private static final Insets insets = new Insets(0, 0, 0, 0);

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new GridBagLayoutTest());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame(
                "Make a component span multiple rows in GridBagLayout when using only one column");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createFlag());
        frame.pack();
        frame.setVisible(true);

    }

    private JPanel createFlag() {
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());
        panel.setPreferredSize(new Dimension(450, 300));

        JPanel row1 = new JPanel();
        row1.setBackground(new Color(237, 27, 36));

        JPanel row2 = new JPanel();
        row2.setBackground(Color.WHITE);

        JPanel row3 = new JPanel();
        row3.setBackground(new Color(26, 29, 80));

        JPanel row4 = new JPanel();
        row4.setBackground(Color.WHITE);

        JPanel row5 = new JPanel();
        row5.setBackground(new Color(237, 27, 36));

        // We are trying to draw Flag of Thailand
        int gridy = 0;
        addComponent(panel, row1, 0, gridy++, 1, 1, 1D, 1D,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH);
        addComponent(panel, row2, 0, gridy++, 1, 1, 1D, 1D,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH);
        addComponent(panel, row3, 0, gridy++, 1, 1, 1D, 2D,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH);
        addComponent(panel, row4, 0, gridy++, 1, 1, 1D, 1D,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH);
        addComponent(panel, row5, 0, gridy++, 1, 1, 1D, 1D,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH);

        return panel;
    }

    private void addComponent(Container container, Component component,
            int gridx, int gridy, int gridwidth, int gridheight,
            double weightx, double weighty, int anchor, int fill) {
        GridBagConstraints gbc = new GridBagConstraints(gridx, gridy,
                gridwidth, gridheight, weightx, weighty, anchor, fill, insets,
                0, 0);
        container.add(component, gbc);
    }

}

您始终可以在第3行之后添加另一个蓝色行。不是真的回答你的问题,但会解决你的问题我举了一个简单的例子来解释这个问题。实际上,这是我操纵的某个JList或某个jtext区域。因此,您的答案不可能是解决方案。您始终可以在第3行之后添加另一个蓝色行。不是真的回答你的问题,但会解决你的问题我举了一个简单的例子来解释这个问题。实际上,这是我操纵的某个JList或某个jtext区域。因此,你的答案不可能是一个解决方案。