JLabel 不以全屏为中心
JLabel doesn't center on full screen
在我的 JFrame 上,我有一个 GridLayout(5,5)。在其中一个单元格中,我有一个 CellPanel,它扩展了 JPanel,我在其中添加了一个带有 ImageIcon 的 JLabel。我将 JLabel 居中,但是当我将 window 设置为全屏时,JLabel 不再居中。知道为什么吗?我还想在 window 全屏时缩放 JLabel。 JFrame 大小为 640x480。
我的部分代码:
for(int i=0; i<25; i++)
{
switch(i){
case(0):
icon = new ImageIcon("Resurse/entrance.png");
cell = new CellPanel(icon.getImage());
break;
case(22):
icon = new ImageIcon("Resurse/exit.png");
cell = new CellPanel(icon.getImage());
break;
case(5):
icon = new ImageIcon("Resurse/ground.png");
cell = new CellPanel(icon.getImage());
footPrint = new JLabel();
iconSolver = new ImageIcon("Resurse/fading.png");
footPrint.setIcon(iconSolver);
footPrint.setHorizontalAlignment(JLabel.CENTER);
footPrint.setVerticalAlignment(JLabel.CENTER);
cell.add(footPrint);
break;
...
}
}
正常尺寸:
全屏:
关键问题:您的单元格 JPanel 使用什么布局?
您正在使用 FlowLayout,因此 JLabel 默认为其 preferredSize 并放置在顶部中心,这正是您所看到的。
我会选择 BorderLayout 或 GridBagLayout。后者,GridBagLayout 将使自动添加的组件居中,如果只添加一个组件并且添加时没有网格包约束,则将其保留在其首选大小。我在国际象棋程序中使用它来将棋子放在棋盘单元中。添加标签的 BorderLayout BorderLayout.CENTER 将使您的 JLabel 填充单元格 JPanel,如果 JLabel 的图像在 JLabel 展开时居中,这也可以工作。
一些附带建议:
- 避免像您的代码那样重新读取图像。相反,请考虑一次读取图像,将它们存储在 ImageIcon 变量中,然后根据需要使用图标。此建议的主要风险是如果您的图像非常大,在这种情况下您将不得不注意内存限制。
在我的 JFrame 上,我有一个 GridLayout(5,5)。在其中一个单元格中,我有一个 CellPanel,它扩展了 JPanel,我在其中添加了一个带有 ImageIcon 的 JLabel。我将 JLabel 居中,但是当我将 window 设置为全屏时,JLabel 不再居中。知道为什么吗?我还想在 window 全屏时缩放 JLabel。 JFrame 大小为 640x480。
我的部分代码:
for(int i=0; i<25; i++)
{
switch(i){
case(0):
icon = new ImageIcon("Resurse/entrance.png");
cell = new CellPanel(icon.getImage());
break;
case(22):
icon = new ImageIcon("Resurse/exit.png");
cell = new CellPanel(icon.getImage());
break;
case(5):
icon = new ImageIcon("Resurse/ground.png");
cell = new CellPanel(icon.getImage());
footPrint = new JLabel();
iconSolver = new ImageIcon("Resurse/fading.png");
footPrint.setIcon(iconSolver);
footPrint.setHorizontalAlignment(JLabel.CENTER);
footPrint.setVerticalAlignment(JLabel.CENTER);
cell.add(footPrint);
break;
...
}
}
正常尺寸:
全屏:
关键问题:您的单元格 JPanel 使用什么布局?
您正在使用 FlowLayout,因此 JLabel 默认为其 preferredSize 并放置在顶部中心,这正是您所看到的。
我会选择 BorderLayout 或 GridBagLayout。后者,GridBagLayout 将使自动添加的组件居中,如果只添加一个组件并且添加时没有网格包约束,则将其保留在其首选大小。我在国际象棋程序中使用它来将棋子放在棋盘单元中。添加标签的 BorderLayout BorderLayout.CENTER 将使您的 JLabel 填充单元格 JPanel,如果 JLabel 的图像在 JLabel 展开时居中,这也可以工作。
一些附带建议:
- 避免像您的代码那样重新读取图像。相反,请考虑一次读取图像,将它们存储在 ImageIcon 变量中,然后根据需要使用图标。此建议的主要风险是如果您的图像非常大,在这种情况下您将不得不注意内存限制。