2016-12-29 3 views
0

GridLayout을 사용하면 GridLayout은 행과 열 요소간에 컨테이너의 공간을 고르게 분산시킵니다. 그러나 셀 너비를 계산할 때 정수로 표시되지 않을 경우 초과 된 공간은 컨테이너의 가장자리와 내용 사이에 배치되며 컨테이너의 내용은 GridLayout에 의해 중앙에 배치됩니다. 당신이 공간 (그린 색)를 초과 볼 수 있습니다이 그림에서 GridLayout에서 초과/외부 공간 처리

: 프레임의 크기가 LayoutManager의 각 구성 요소 층을 제공하는 것이 233x233 끌고 있기 때문에

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

을 (20분의 233) = 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); 

그래서 나는이 초과하는 공간을하지 않는 용기 '클립'을 만들거나하는 방식으로 정렬 할 수있는 쉬운 방법이 있는지 궁금 : 사진의 프레임을 생성하는 코드의

표시되지만 콘테이너의 내용에 맞게 컨테이너의 크기가 조정됩니다. 맞아요하지만 난 모든 세포에 동일한 크기를 제공하는 GridLayout과의 장점을 유지하려는

+1

AFAIU'GridBagLayout'은 공간의 여분의 픽셀을'GridLayout'보다 잘 처리합니다. 구성 요소에 가중치를 할당하여 먼저 어떤 열과 행이 여분의 공간을 확보 할지를 제어 할 수 있습니다. –

+0

맞아요.하지만 모든 셀에 같은 크기의 GridLayout을 제공하고 싶습니다. GridBagLayout과 각 셀의 다양한 패널이 사용 된 경우에는 그렇지 않습니다. – Reizo

답변

1

,

예 잘 당신은이 두 가지를 가질 수 없습니다.

  1. 모든 셀의 크기를 동일하게 설정하려면 배경이 표시됩니다. 한 가지 옵션은 패널을 불투명하지 않게 만드는 것이므로 패널의 배경을 보지 못합니다.

  2. 구성 요소로 사용 가능한 영역을 완전히 채우려면 일부 구성 요소가 1 픽셀 씩 다른 크기 여야합니다.

    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 클래스를 사용하여 사용하는 점 2를 구현하기위한

은, 어쩌면이 예는 쉽게 충분합니다 구성 요소.

+0

이것이 내가 찾은 것입니다. 감사합니다! 픽셀을 단일 구성 요소에 추가하거나 (솔루션 에서처럼) 포함 된 패널의 크기를 한 단계 더 낮은 (/ 높음) 잘 맞는 크기로 조정해야합니다. – Reizo

관련 문제