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