在 GridLayout 中处理 exceeding/outer space
Handling exceeding/outer space in GridLayout
使用 GridLayout 时,它会将容器的 space 均匀分布在行元素和列元素之间。但是,当计算单元格宽度不会变成整数时,超出的 space 以某种方式放在容器的边缘与其内容之间,即容器的内容以 GridLayout 为中心。
在这张图片中你可以看到超过 space(绿色):
由于框架的大小被拖到 233x233,LayoutManager 将提供每个组件 floor(233 / 20) = 11 像素的高度和宽度。因此 233 % 20 = 13 个像素超出并放在边缘。
这就是图片中生成边框的代码:
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridLayout layout = new GridLayout(20, 0);
layout.setHgap(0);
layout.setVgap(0);
frame.setLayout(layout);
for (int j = 0; j < 20; j++) {
for (int i = 0; i < 20; i++) {
JPanel panel = new JPanel();
panel.setBackground((i + j) % 2 == 0 ? Color.BLACK : Color.WHITE);
frame.add(panel);
}
}
frame.pack();
frame.getContentPane().setBackground(Color.GREEN);
frame.setVisible(true);
所以我想知道是否有一种简单的方法可以使容器 'clip' 或以某种方式对齐,超过 space 的不会显示出来,而是调整容器的大小以适合它的内容非常完美。
That's right but I want to keep the advantage of a GridLayout offering every cell the same size,
是的,你不能两全其美。
如果您希望每个单元格大小相同,那么您将看到背景。一种选择是使面板不透明,这样您就看不到面板的背景。
如果要用组件完全填充可用区域,则某些组件的大小需要相差一个像素。
为了实现第 2 点,也许这个例子对您来说足够容易使用:
import java.awt.*;
import javax.swing.*;
public class BoardTest
{
private static void createAndShowGUI()
{
Float constraint = new Float(1);
RelativeLayout boardLayout = new RelativeLayout(RelativeLayout.Y_AXIS);
boardLayout.setRoundingPolicy( RelativeLayout.EQUAL );
boardLayout.setFill(true);
JPanel board = new JPanel(boardLayout);
board.setBackground(Color.GREEN);
RelativeLayout rowLayout = new RelativeLayout(RelativeLayout.X_AXIS);
rowLayout.setRoundingPolicy( RelativeLayout.EQUAL );
rowLayout.setFill(true);
for (int j = 0; j < 20; j++)
{
JPanel row = new JPanel( rowLayout );
for (int i = 0; i < 20; i++)
{
JPanel square = new JPanel();
square.setBackground((i + j) % 2 == 0 ? Color.BLACK : Color.WHITE);
row.add(square, constraint);
}
board.add(row, constraint);
}
JFrame frame = new JFrame("BoardTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(board);
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater( () -> createAndShowGUI() );
/*
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
*/
}
}
它使用 Relative Layout class 允许您控制如何将额外像素分配给每个组件。
使用 GridLayout 时,它会将容器的 space 均匀分布在行元素和列元素之间。但是,当计算单元格宽度不会变成整数时,超出的 space 以某种方式放在容器的边缘与其内容之间,即容器的内容以 GridLayout 为中心。
在这张图片中你可以看到超过 space(绿色):
由于框架的大小被拖到 233x233,LayoutManager 将提供每个组件 floor(233 / 20) = 11 像素的高度和宽度。因此 233 % 20 = 13 个像素超出并放在边缘。
这就是图片中生成边框的代码:
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridLayout layout = new GridLayout(20, 0);
layout.setHgap(0);
layout.setVgap(0);
frame.setLayout(layout);
for (int j = 0; j < 20; j++) {
for (int i = 0; i < 20; i++) {
JPanel panel = new JPanel();
panel.setBackground((i + j) % 2 == 0 ? Color.BLACK : Color.WHITE);
frame.add(panel);
}
}
frame.pack();
frame.getContentPane().setBackground(Color.GREEN);
frame.setVisible(true);
所以我想知道是否有一种简单的方法可以使容器 'clip' 或以某种方式对齐,超过 space 的不会显示出来,而是调整容器的大小以适合它的内容非常完美。
That's right but I want to keep the advantage of a GridLayout offering every cell the same size,
是的,你不能两全其美。
如果您希望每个单元格大小相同,那么您将看到背景。一种选择是使面板不透明,这样您就看不到面板的背景。
如果要用组件完全填充可用区域,则某些组件的大小需要相差一个像素。
为了实现第 2 点,也许这个例子对您来说足够容易使用:
import java.awt.*;
import javax.swing.*;
public class BoardTest
{
private static void createAndShowGUI()
{
Float constraint = new Float(1);
RelativeLayout boardLayout = new RelativeLayout(RelativeLayout.Y_AXIS);
boardLayout.setRoundingPolicy( RelativeLayout.EQUAL );
boardLayout.setFill(true);
JPanel board = new JPanel(boardLayout);
board.setBackground(Color.GREEN);
RelativeLayout rowLayout = new RelativeLayout(RelativeLayout.X_AXIS);
rowLayout.setRoundingPolicy( RelativeLayout.EQUAL );
rowLayout.setFill(true);
for (int j = 0; j < 20; j++)
{
JPanel row = new JPanel( rowLayout );
for (int i = 0; i < 20; i++)
{
JPanel square = new JPanel();
square.setBackground((i + j) % 2 == 0 ? Color.BLACK : Color.WHITE);
row.add(square, constraint);
}
board.add(row, constraint);
}
JFrame frame = new JFrame("BoardTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(board);
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater( () -> createAndShowGUI() );
/*
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
*/
}
}
它使用 Relative Layout class 允许您控制如何将额外像素分配给每个组件。