2016-12-29 28 views
0

使用GridLayout时,它将其容器的空间均匀地分布在其行和列元素之间。但是,当计算单元格宽度不会以整数形式出现时,超出的空间将以某种方式放置在容器的边缘和内容之间,容器的内容由GridLayout居中。处理GridLayout中的超出/外层空间

在此照片中可以看到超过空间(着色绿色):

https://i.stack.imgur.com/UTDpT.png

由于框架的尺寸被拖动到233x233 LayoutManager的将提供各成分地板(232/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); 

所以我想如果有一个简单的方法,使容器“夹”或在某种程度上一致,这超过空间不显示,但相反,容器的大小调整,以适应其内容完美。

+1

AFAIU'GridBagLayout'比GridLayout更能处理更多的空间像素。通过为组件分配权重,我们可以控制哪些列和行将首先获得额外的空间。 –

+0

这是对的,但我想保持GridLayout的优势,即为每个单元格提供相同的大小,但如果使用GridBagLayout和每个单元格中更多不同的面板,情况就不会如此。 – Reizo

回答

1

这是正确的,但我想保持一个网格布局的优势,提供的每一个细胞的大小相同,

是很好,你不能两者兼得。

  1. 如果您希望每个单元格具有相同的大小,那么您将看到背景。一种选择是使面板不透明,所以你看不到面板的背景。

  2. 如果您想完全填充组件可用的区域,那么某些组件将需要不同的大小一个像素。

为了实现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类,它允许你控制额外的像素是如何分配给每个组件。

+0

这是我搜索的,谢谢!像素应该添加到单个组件中(就像在您的解决方案中一样),或者应该将包含的面板调整到下一个更低(更高)的合适尺寸。 – Reizo