【问题标题】:JLabel doesn't center on full screenJLabel 不在全屏上居中
【发布时间】:2015-06-09 12:12:37
【问题描述】:

在我的 JFrame 上,我有一个 GridLayout(5,5)。在其中一个单元格中,我有一个扩展 JPanel 的 CellPanel,我在其中添加了一个带有 ImageIcon 的 JLabel。我将 JLabel 居中,但是当我将窗口设置为全屏时,JLabel 不再居中。知道为什么吗?我还想在窗口全屏时缩放 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 使用什么布局?我会选择 BorderLayout 或 GridBagLayout。后者,如果只添加一个组件,GridBagLayout 将自动添加一个组件居中,并且在没有网格包约束的情况下添加。 BorderLayout 将使您的 JLabel 填充单元格 JPanel,如果在 JLabel 展开时 JLabel 的图像居中,这也可以工作。
  • 在两张图片中,图像仅水平居中,而不是垂直居中。
  • 确实只是水平居中,而不是垂直居中,但是为什么呢?
  • 为什么是因为这就是 FlowLayout 的行为方式。您的 JLabel 保持其首选大小,并位于 JPanel 的顶部中心。通过使用 BorderLayout 并将其放置 BorderLayout.CENTER 来扩展 JLabel,或者使用 GridBagLayout,它不会扩展 JLabel 并将其保留为首选大小,但将其放置在中心(如果也没有添加其他内容)。

标签: java swing fullscreen jlabel centering


【解决方案1】:

关键问题:您的单元格 JPanel 使用什么布局?

您正在使用 FlowLayout,因此 JLabel 默认为它的 preferredSize 并位于顶部中心,正是您所看到的。

我会选择 BorderLayout 或 GridBagLayout。后者,GridBagLayout 将自动添加的组件居中,使其保持其首选大小,如果仅添加一个组件并添加没有网格包约束。我在国际象棋程序中使用它来将棋子集中在棋盘单元中。添加标签的 BorderLayout.CENTER 将使您的 JLabel 填充单元格 JPanel,如果 JLabel 的图像在 JLabel 展开时居中,这也可以工作。

一些旁白:

  • 避免像您的代码那样重新读取图像。而是考虑一次读取图像,将它们存储在 ImageIcon 变量中,然后根据需要使用图标。此建议的主要风险是如果您的图像非常大,在这种情况下您将不得不注意内存限制。

【讨论】:

  • 如果我没记错的话,我使用默认的 FlowLayout。
  • @Andrew:如果您没有设置布局,那么这就是您正在使用的。把它改成 GridBagLayout 看看会发生什么。
  • 如前所述(但也想为我自己担保)你应该为你的应用程序使用 GridBagLayout,它更适合这个目的
猜你喜欢
  • 1970-01-01
  • 2017-05-08
  • 2013-11-14
  • 1970-01-01
  • 2014-08-03
  • 2016-09-16
  • 2012-04-07
  • 1970-01-01
相关资源
最近更新 更多