2016-12-29 29 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