문제

버튼 장소를 나란히 만드는 방법 Gridbaglayout을 사용하여 레이아웃을 설계했습니다. 문제는 버튼이 서로 너무 멀리 떨어져 있다는 것입니다. 중앙을 앵커로 선택하려고했지만 버튼이 겹치게됩니다. 서쪽과 동쪽을 사용하면 버튼이 서로 너무 멀리 떨어져 있습니다.

예를 들어 저장 ---------- 새로운 패턴을 저장하는 대신 새 패턴.

JButton bSave = new JButton("SAVE");
JButton bPattern = new JButton("NEW_PATTERN");
con = new GridBagConstraints();
con.anchor=GridBagConstraints.WEST;
con.gridy = 3; con.gridx = 0;           
con.gridwidth = 1; con.gridheight = 1;      
con.insets= new Insets(2,5,2,2);        
m.setConstraints(bSave, con);
c.add(bSave);
con.weightx=1;
con.gridy=3; con.gridx=0;
con.anchor=GridBagConstraints.EAST;
m.setConstraints(bPattern,con);
c.add(bPattern);
도움이 되었습니까?

해결책

감사합니다 AKF, FlowLayout을 Gridbaglayout 내에 배치하여 문제를 해결했습니다.

....
JButton bSave = new JButton("Save");
JButton bPattern = new JButton("New Pattern");
JPanel pContainer = new JPanel();
pContainer.setLayout(new FlowLayout(FlowLayout.CENTER));
pContainer.add(bSave); pContainer.add(bPattern); 
con = new GridBagConstraints();
con.anchor=GridBagConstraints.CENTER;
con.gridy = 3; con.gridx = 0;           
con.gridwidth = 1; con.gridheight = 1;      
m.setConstraints(pContainer, con);
c.add(pContainer);
....

다른 팁

Gridbaglayout은 가장 복잡한 레이아웃입니다. 몇 개의 버튼을 정렬하는 경우 FlowLayout (기본값) 또는 BoxLayout을 사용하는 것이 좋습니다. 그러나 앵커를 조정하는 대신 gridbaglayout을 사용하려면 두 번째 버튼의 경우 gridx를 1으로 조정하십시오. 또한 왜 당신이 0의 그리드 대신 3의 그리드가 있는지 잘 모르겠습니다 (다른 코드가없는 한 0-2의 그리드를 사용하는 다른 코드가없는 한).

새로운 질문을 게시하기 전에 이전 게시물을 먼저 읽지 않겠습니까?

마지막 게시물에서 스윙 튜토리얼 링크가 제공됩니다. 따라서 튜토리얼을 읽고 예제를 시도하고 작업을 위해 적절한 레이아웃 관리자 또는 레이아웃 관리자의 조합을 사용하십시오.

대신에 GridBagLayout,GridLayout 간단한 솔루션입니다. 설정하기 쉽습니다.

JButton bSave = new JButton("SAVE");
JButton bPattern = new JButton("NEW_PATTERN");
JPanel panel = new JPanel(new GridLayout(1,2); // 1 row, 2 cols
panel.add(bSave);
panel.add(bPattern);

편집하다:

호기심으로 인해 나는 당신의 원본을 속이고 Gridbaglayout 만 사용할 수있는 조합을 찾았습니다. 원본과 크게 다르지 않습니다.

GridBagConstraints con = new GridBagConstraints();
con.anchor=GridBagConstraints.WEST;
con.gridy = 3;
con.gridx = 0;                   
con.gridwidth = 1; 
con.gridheight = 1;          
con.insets= new Insets(2,5,2,2);        
m.setConstraints(bSave, con);
c.add(bSave);
con.weightx=0;
con.gridy=3;
con.gridx=1;//this is the big diff!
con.anchor=GridBagConstraints.EAST;
m.setConstraints(bPattern,con);
c.add(bPattern);

이 코드는 화면 중앙의 버튼을 나란히 위치시킵니다.

열쇠는 다음과 같습니다.

제약 조건 .fill = gridbagconstraints.none;-> 벨트 폰을 확장하지 않도록 만듭니다.

제약 조건. insets.right = 0;-> 버튼을 나란히 서 있습니다.

restaints.insets.left = 0;-> 버튼을 나란히 서있게 만듭니다.

제약 조건 록스 = 1-> 버튼의 셀을 수평으로 확장시킵니다.

제약 조건. anchor = gridbagconstraints.east;-> 왼쪽 버튼을 셀에 서도록합니다.

제약 조건. anchor = gridbagconstraints.west;-> 셀 왼쪽에 오른쪽 버튼을 만듭니다.

public static void main(String args[]){
        JFrame frame=new JFrame();
        Container cont=frame.getContentPane();
        cont.setLayout(new GridBagLayout());

        GridBagConstraints constraints=new GridBagConstraints();
        constraints.insets.top=2;
        constraints.insets.bottom=2;
        constraints.insets.left=0;// increment to separate buttons
        constraints.insets.right=0;// increment to separate buttons
        constraints.fill=GridBagConstraints.NONE;
        constraints.weightx=1;
        constraints.gridy=0;

        constraints.anchor=GridBagConstraints.EAST;
        constraints.gridx=0;
        cont.add(new JButton("Save"),constraints);

        constraints.anchor=GridBagConstraints.WEST;
        constraints.gridx=1;
        cont.add(new JButton("New Pattern"),constraints);

        frame.pack();
        frame.setVisible(true);
    }

Gridbaglayout에 대한 자습서는 상자에서 가장 고급 레이아웃 관리자가되어 다른 레이아웃 관리자를 사용하지 않기 때문에 다른 것들을 읽을 것을 권장합니다. 그런 이유로 배우는 것이 좋습니다. 그리드로 생각하면 모든 것을 단순하게 만듭니다. 그리고 당신이 바로 얻어야하는 모든 것은 코드에서 놓친 X와 Y 좌표입니다. 당신은 거의 거기에 있었다 :)

레이아웃 관리자를 믹싱하는 것은 일반적으로 추가 공간으로 컨테이너를 채울 때 약간 다르게 작동하기 때문에 매우 나쁜 생각입니다.

@camickr 내 의견을 기반으로하는 사람들은 Gridbaglayout을 사용해야합니다. 단 하나만 있으면 간단하고 유지 관리 가능해야합니다. 또한 논리적으로 맵핑되었으므로 읽기가 매우 쉽습니다. ContStraints는 모든 구성 요소에 하나의 제약 조건 객체를 사용하는 경우에만 변경됩니다. 이는 분명히 나쁜 생각입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top