2012-12-30 2 views
1

매우 간단한 Java 프로그램이 있습니다 (아래 참조). GridLayout에는 20 개의 행과 4 개의 열이 있습니다. 아시다시피 요소는 (GridLayout) 정의에 의해 가로로 추가되어야합니다. 그러나 두 요소 (레이블)를 수직으로 배치합니다.GridLayout에서 크기가 조정되는 JLabels

나는 그것들을 색칠하고 레이블이 전체 행을 차지하므로 수직적 효과를 얻음을 깨달았다. 하지만 setSize (5,5)를 사용하여 각각을 작게 만들었지 만 여전히 전체 행을 차지합니다. 왜 이런 일이 일어나는 지에 대한 조언과 더 작은 크기/고정/고정 방법은 무엇입니까?

public class Sam extends JFrame { 

    public JButton btn_arr; 
    public Container c; 
    public JLabel[] lbl = new JLabel[20]; 


    public Sam() 
    { 
     c = getContentPane(); 
     c.setLayout(new GridLayout(20,4)); 
     lbl[1] = new JLabel("Column1"); 
     c.add(lbl[1]); 

     lbl[2] = new JLabel("Column2"); 
     c.add(lbl[2]); 

     show();  
    } 

    public static void main(String[] args) 
    { 
     Sam x = new Sam(); 
     x.setVisible(true); 
     x.setSize(7500,4500); 
    } 

} 

답변

3

그리드에 두 개의 구성 요소를 추가하기 때문에 채울 것입니다. 기존 JLabel을 적절한 위치 (빈 JLabel 또는 JPanels)에 배치 할 수 있도록 배치에 더 많은 구성 요소를 그리드에 추가해야합니다.

제쳐두고, Swing 구성 요소의 크기를 설정하지 마십시오. 현재 7500, 4500 크기는 약간 큰 크기입니다.

둘째로, 여기서 JTable을 대신 사용하려고합니다.

편집 :

c.setLayout(new GridLayout(0, 4)); 

예를 들어,

import java.awt.*; 
import javax.swing.*; 

public class Sam extends JFrame { 
    public static final int COLUMN_COUNT = 4; 

    public JButton btn_arr; 
    public Container c; 
    public JLabel[] lbl = new JLabel[COLUMN_COUNT]; 

    public Sam() { 
     c = getContentPane(); 
     c.setLayout(new GridLayout(0, COLUMN_COUNT)); 

     for (int i = 0; i < lbl.length; i++) { 
     lbl[i] = new JLabel("Column " + (i + 1)); 
     c.add(lbl[i]); 
     } 

    } 

    public static void main(String[] args) { 
     Sam x = new Sam(); 
     x.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     x.pack(); 
     x.setLocationRelativeTo(null); 
     x.setVisible(true); 
     // x.setSize(7500,4500); 
    } 

} 

하지만 여전히 내가 궁금해 : 당신은 4 열 및 행의 변수 수있는 GridLayout과 일정 당신의 GridLayout과 행에 0를 사용하려는 경우 JTable가 여기서 잘 작동하지 않는 경우.

+0

동일한 행에 두 개의 JLabel이 필요하므로 두 요소를 차례로 추가하여이 작업을 수행해야합니다. 2 열이 있고 다른 요소 위에 하나씩 두 개의 요소가 필요한 경우 첫 번째 요소를 추가하고 빈 레이블을 추가 한 다음 두 번째 요소를 추가합니다 (그 트릭을 알고 있음). 그러나 이것은 사실이 아닙니다. 배열의 처음 두 요소 (각 JLabel)가 여기 같은 줄에 있어야합니다. 고맙습니다! – Sam

+1

@Sam : 편집을 참조하십시오. 하지만 여전히 JTable이 더 잘 작동하지 않을지 궁금합니다. –

+0

가변 개수의 행에 대해 0을 사용할 수 있다는 것을 알지 못했습니다. 정확히 내가 관심이 있었던 부분입니다. 우수하고 많은 감사합니다! – Sam

2

GridLayout에서 유의해야 할 점 중 하나는 가능한 모든 셀을 크기 조정하는 패널을 포함하도록 설계되었으며 셀에 추가 된 요소가 전체 셀을 채우기 위해 확장됩니다. 따라서 셀 크기가 변경되면 레이블의 크기도 변경됩니다. 효과적으로 그리드 셀은 포함 된 모든 요소의 X 및 Y 방향으로 확장/축소를 강제합니다.

GridLayout을 사용해야하는 경우 발생하지 않도록하는 한 가지 방법은 GridLayout을 사용하는 컨테이너에 직접 레이블을 추가하지 않고 대신 각 레이블을 FlowLayout (기본값)을 사용하는 JPanel 내부에 배치하는 것입니다. 왼쪽, 중간 또는 오른쪽 정렬을 설정 한 다음 해당 JPanel을 Grid 컨테이너에 추가 할 수 있습니다. JPanel의 크기가 조정되지만 Label의 크기는 변경되지 않습니다.

또는 GridBagLayout 관리자를 사용하십시오. 더 복잡하지만 일단 그것을 이해하면 삶이 더 쉬워집니다. 그러나 Hovercraft가 언급했듯이, 여러분이하려고하는 것이 컬럼 헤더를 가진 그리드를 만드는 것이라면, JTable이 더 좋은 선택 일 것입니다.

+0

매우 도움이됩니다. 감사합니다. 나는 매우주의 깊게 메모를하고 그 재치에서 적용 할 것입니다! – Sam

관련 문제