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 变量中,然后根据需要使用图标。此建议的主要风险是如果您的图像非常大,在这种情况下您将不得不注意内存限制。