GridLayout不会填满整个窗口

时间:2018-05-02 20:21:34

标签: java swing layout-manager grid-layout

虽然我正在添加x * y按钮,但是JInteralFrame GridLayout(x, y)a:link { text-decoration: none!important; } nav li a { color: #fff; font-size: 14px; position: relative; letter-spacing: 2px; text-transform: uppercase; -webkit-transition: all 0.4s ease; transition: all 0.4s ease; margin: 15px; } a:after { content: ""; position: absolute; height: 2px; background-color: white; width: 0; left: 50%; bottom: 0; -webkit-transform: translateX(-50%); -ms-transform: translateX(-50%); transform: translateX(-50%); -webkit-transition: 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55) all; transition: 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55) all; } a:hover { color: tomato; } a:active:after { width: 100%; } body{background-color:black}并没有填满整个窗口的原因是什么?为什么周围会有白色空间,如下图所示?

如果我稍微调整一下,我可以删除网格布局周围的所有空白区域,如下面的第二张图片,但我不明白为什么情况并非如此。

with a white frame around it

no white frame

2 个答案:

答案 0 :(得分:1)

  

为什么周围会出现白色空间,如下图所示?

GridLayout为每个组件分配完全相同的宽度或高度,但对于GUI 20(例如)组件范围,只能实现GUI拉伸的每20个像素。它将任何“剩余”像素的空间排列到左侧和右侧的组件。

要解决这个问题,您可以改为使用GridBagLayout并调整行和列的权重,以允许某些组件以几乎无法察觉的方式接管剩余空间(组件大小的差异)给用户。

答案 1 :(得分:1)

  

为什么周围会出现白色空间,如下图所示?

安德鲁的回答解释了GridLayout的问题。

但是我不知道是否可以使用任何其他标准JDK布局管理器修复此问题。

查看Relative Layout。它是一个布局管理器,允许您为组件提供相对于彼此的大小,因此很容易使所有组件的大小相同。当有额外像素时,您可以设置“舍入策略”以将像素分配给不同的组件。

布局稍微复杂一些,因为单个布局管理器无法完成。在下面的示例中,您需要一个使用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();
            }
        });
*/
    }
}