2015-04-04 53 views
1

在我的JFrame上我有一个GridLayout(5,5)。在其中一个单元格中,我有一个CellPanel,它扩展了JPanel,其中我添加了一个带有ImageIcon的JLabel。我将JLabel居中,但当我将窗口设置为全屏时,JLabel不再是中心。任何想法为什么?另外我想在窗口全屏时缩放JLabel。 JFrame大小是640x480。我的代码JLabel不以全屏幕为中心

部分:

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; 
      ... 
     } 
    } 

正常大小: enter image description here

全屏: enter image description here

+2

关键问题:您的单元JPanel使用什么布局?我会去BorderLayout或GridBagLayout。后者,如果只添加一个组件并添加而没有网格包的约束,则GridBagLayout将会自动添加一个组件。 BorderLayout将使您的JLabel填充单元JPanel,如果在JLabel展开时JLabel的图像居中,这也可以工作。 – 2015-04-04 16:09:36

+1

在这两张照片中,图像仅居中居中,而不是垂直居中。 – 2015-04-04 16:11:28

+0

确实只是水平居中,而不是垂直居中,但为什么? – Andrew 2015-04-04 16:16:44

回答

3

关键的问题:做你的细胞JPanels使用什么布局?

您正在使用FlowLayout,所以JLabel默认为其preferredSize,并放置在顶部中心,正是您所看到的。

我会去与BorderLayout或GridBagLayout。后者,GridBagLayout将会自动添加一个组件的中心,如果只添加了一个组件并添加了没有网格包的限制,它将保持其首选大小。我已经在国际象棋程序中使用这个功能来将棋子置于棋盘格中。标签添加BorderLayout.CENTER的BorderLayout将使您的JLabel填充单元JPanel,如果在JLabel展开时JLabel的图像居中,这也可以工作。

一些侧区域经济共同体:

  • 避免重新读取你的图像作为你的代码似乎在做。请考虑一次性读取图像,将它们存储在ImageIcon变量中,然后根据需要使用图标。这个建议的主要风险是如果你的图像相当大,在这种情况下你将不得不观看内存限制。
+0

如果我没有弄错,我使用默认的FlowLayout。 – Andrew 2015-04-04 16:15:25

+1

@Andrew:如果你没有设置布局,那就是你正在使用的。将其更改为GridBagLayout并查看会发生什么。 – 2015-04-04 16:16:26

+2

如前所述(但也想为自己担保),您应该使用GridBagLayout来处理您的应用程序,它更适合用于此目的。 – Juxhin 2015-04-04 16:18:44