Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 网格布局不';不要把整个窗户都填满_Java_Swing_Layout Manager_Grid Layout - Fatal编程技术网

Java 网格布局不';不要把整个窗户都填满

Java 网格布局不';不要把整个窗户都填满,java,swing,layout-manager,grid-layout,Java,Swing,Layout Manager,Grid Layout,带GridLayout(x,y)的JInteralFrame不能填满整个窗口的原因是什么,尽管我在其中添加了x*y按钮?为什么它周围有空白,就像下面的第一张图片一样 如果我稍微调整它的大小,我就可以删除网格布局周围的所有空白,如下面的第二张图片所示,但我不明白为什么不总是这样 为什么它周围有空白,就像下面的第一张图片一样 GridLayout为每个组件指定完全相同的宽度或高度,但是对于20个(例如)组件宽的GUI,只有在GUI拉伸的每20个像素中才能这样做。它将空间的任何“剩余”像素排列到最

GridLayout(x,y)
JInteralFrame
不能填满整个窗口的原因是什么,尽管我在其中添加了x*y按钮?为什么它周围有空白,就像下面的第一张图片一样

如果我稍微调整它的大小,我就可以删除网格布局周围的所有空白,如下面的第二张图片所示,但我不明白为什么不总是这样

为什么它周围有空白,就像下面的第一张图片一样

GridLayout
为每个组件指定完全相同的宽度或高度,但是对于20个(例如)组件宽的GUI,只有在GUI拉伸的每20个像素中才能这样做。它将空间的任何“剩余”像素排列到最左侧和最右侧的组件

为了解决这个问题,您可以使用
GridBagLayout
并调整行和列的权重,以允许某些组件以用户几乎看不到的方式(组件大小的差异)占据剩余空间

为什么它周围有空白,就像下面的第一张图片一样

GridLayout
为每个组件指定完全相同的宽度或高度,但是对于20个(例如)组件宽的GUI,只有在GUI拉伸的每20个像素中才能这样做。它将空间的任何“剩余”像素排列到最左侧和最右侧的组件

为了解决这个问题,您可以使用
GridBagLayout
并调整行和列的权重,以允许某些组件以用户几乎看不到的方式(组件大小的差异)占据剩余空间

为什么它周围有空白,就像下面的第一张图片一样

安德鲁的回答解释了网格布局的问题

但是,我不知道是否可以用任何其他标准的JDK布局管理器解决这个问题

看看这本书。它是一个布局管理器,允许您为组件指定一个相对于另一个组件的尺寸,因此很容易使所有组件具有相同的尺寸。当有额外像素时,可以设置“舍入策略”,将像素分配给不同的组件

布局稍微复杂一点,因为它不能用一个布局管理器来完成。在下面的示例中,您需要一个使用
RelativeLayout
进行垂直布局的面板。然后,您需要为每行创建一个单独的面板,这些面板将使用带有水平布局的
RelativeLayout

import java.awt.*;
import javax.swing.*;

public class SSCCE extends JPanel
{
    SSCCE()
    {
        int size = 10;
        setBackground( Color.RED );

        Float constraint = new Float(1.0f);
        RelativeLayout vertical = new RelativeLayout(RelativeLayout.Y_AXIS);
        vertical.setRoundingPolicy( RelativeLayout.EQUAL );
        vertical.setFill(true);
        setLayout( vertical );

        for (int i = 0; i < size; i++)
        {
            RelativeLayout horizontal = new RelativeLayout(RelativeLayout.X_AXIS);
            horizontal.setRoundingPolicy( RelativeLayout.EQUAL );
            horizontal.setFill(true);
            JPanel row = new JPanel( horizontal );

            for (int j = 0; j < size; j++)
            {
                row.add(new JButton(), constraint);
            }

            add(row, constraint);
        }
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}
import java.awt.*;
导入javax.swing.*;
公共类SSCCE扩展了JPanel
{
SSCCE()
{
int size=10;
挫折地面(颜色:红色);
浮动约束=新浮动(1.0f);
RelativeLayout垂直=新的RelativeLayout(RelativeLayout.Y_轴);
垂直。setRoundingPolicy(RelativeLayout.EQUAL);
垂直。设置填充(真);
设置布局(垂直);
对于(int i=0;icreateAndShowGUI());
/*
invokeLater(新的Runnable()
{
公开募捐
{
createAndShowGUI();
}
});
*/
}
}
为什么它周围有空白,就像下面的第一张图片一样

安德鲁的回答解释了网格布局的问题

但是,我不知道是否可以用任何其他标准的JDK布局管理器解决这个问题

看看这本书。它是一个布局管理器,允许您为组件指定一个相对于另一个组件的尺寸,因此很容易使所有组件具有相同的尺寸。当有额外像素时,可以设置“舍入策略”,将像素分配给不同的组件

布局稍微复杂一点,因为它不能用一个布局管理器来完成。在下面的示例中,您需要一个使用
RelativeLayout
进行垂直布局的面板。然后,您需要为每行创建一个单独的面板,这些面板将使用带有水平布局的
RelativeLayout

import java.awt.*;
import javax.swing.*;

public class SSCCE extends JPanel
{
    SSCCE()
    {
        int size = 10;
        setBackground( Color.RED );

        Float constraint = new Float(1.0f);
        RelativeLayout vertical = new RelativeLayout(RelativeLayout.Y_AXIS);
        vertical.setRoundingPolicy( RelativeLayout.EQUAL );
        vertical.setFill(true);
        setLayout( vertical );

        for (int i = 0; i < size; i++)
        {
            RelativeLayout horizontal = new RelativeLayout(RelativeLayout.X_AXIS);
            horizontal.setRoundingPolicy( RelativeLayout.EQUAL );
            horizontal.setFill(true);
            JPanel row = new JPanel( horizontal );

            for (int j = 0; j < size; j++)
            {
                row.add(new JButton(), constraint);
            }

            add(row, constraint);
        }
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}
import java.awt.*;
导入javax.swing.*;
公共类SSCCE扩展了JPanel
{
SSCCE()
{
int size=10;
挫折地面(颜色:红色);
浮动约束=新浮动(1.0f);
RelativeLayout垂直=新的RelativeLayout(RelativeLayout.Y_轴);
垂直。setRoundingPolicy(RelativeLayout.EQUAL);
垂直。设置填充(真);
设置布局(垂直);
对于(int i=0;i