2014-09-21 1 views
1

GridBagLayout에 4 열이있는이 JFrame에는 갈색 줄이 열 1과 2 사이의 제한이어야하며 확인 및 취소 버튼이이 한도의 각면에 있어야합니다.GridBagLayout : gridwidth가 1보다 큰 경우의 맞춤과 너비

enter image description here

문제점 :

  • OK + 세트 취소는 다른 버튼을 중심 아니다.
  • 왼쪽 및 오른쪽 JTextArea의 너비가 동일하지 않습니다.

열 1은 열 1과 2가 같을 것으로 예상 될 때 너비가 0 인 것으로 보입니다.

사용되는 코드 : 만 테스트에 대한

import java.awt.Component; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 


public class GblSO extends JFrame { 

    // Instance variables 
    GridBagConstraints gbc = new GridBagConstraints(); 

    public GblSO() { 
     // Set frame 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLayout(new GridBagLayout()); 

     // Text areas 
     JTextArea left = new JTextArea("Left!"); 
     JTextArea right = new JTextArea("Right!"); 
     setConstraints(1, 1, GridBagConstraints.BOTH, null); 
     addToFrame(left, 0, 1, 1, 5, GridBagConstraints.CENTER); 
     addToFrame(right, 3, 1, 1, 5, GridBagConstraints.CENTER); 

     // Transfer buttons 
     JButton addBtn = new JButton(">"); 
     JButton rmvBtn = new JButton("<"); 
     setConstraints(0, 0, GridBagConstraints.NONE, new Insets(3, 5, 3, 5)); 
     addToFrame(addBtn, 1, 1, 2, 1, GridBagConstraints.CENTER); 
     addToFrame(rmvBtn, 1, 3, 2, 1, GridBagConstraints.CENTER); 

     // OK/Cancel buttons 
     JButton okBtn = new JButton("OK"); 
     JButton canBtn = new JButton("Cancel"); 
     setConstraints(0, 0, GridBagConstraints.NONE, new Insets(15, 4, 15, 4)); 
     addToFrame(okBtn, 0, 6, 2, 1, GridBagConstraints.EAST); 
     addToFrame(canBtn, 2, 6, 2, 1, GridBagConstraints.WEST); 

     // Show 
     pack(); 
     setVisible(true); 
    } 

    private void setConstraints(double weightx, double weighty, int fill, Insets insets) { 
     gbc.weightx = weightx; // how much cell resizes 
     gbc.weighty = weighty; // " 
     gbc.fill = fill; // how component fills cell 
     gbc.insets = (insets == null ? new Insets(0, 0, 0, 0) : insets); 
    } 

    private void addToFrame(Component comp, 
      int gridx, int gridy, int gridwidth, int gridheight, int anchor) { 
     gbc.gridx = gridx; 
     gbc.gridy = gridy; 
     gbc.gridwidth = gridwidth; 
     gbc.gridheight = gridheight; 
     gbc.anchor = anchor; 
     add(comp, gbc); 
    } 

    public static void main(String[] args) { 
     new GblSO(); 

    } 

} 

을 : 나는 각각 1 열 및 2의 JFrame>< 버튼을 추가하고, 여러 열, 열 1과 2에 걸쳐하지 않는 경우 동일한 너비를 갖도록 강제 설정되고 아래쪽 단추 세트가 이제 중앙에 배치됩니다.

코드 변경 :

addToFrame(addBtn, 1, 1, 1, 1, GridBagConstraints.CENTER); 
addToFrame(rmvBtn, 2, 3, 1, 1, GridBagConstraints.CENTER); 

결과 :!

enter image description here

JTextArea는 :-(여전히 다른 폭을 가지고 있고, 분명히 >< 정렬 될 수 없습니다

이 문제를 어떻게 해결하여 버튼이 가운데에 오도록 할 수 있습니까? JTextArea은 같은 너비입니까? 도와 주셔서 감사합니다.

는 하나가 기대하는 것처럼 어떻게 든 일을 GridBagLayout에 필요한 각각의 컬럼에 추가 구성 요소를 가지고 있지 않기 때문이다

답변

0

(이 코드는이 tutorial에서 영감). 지금

몇 가지 발언 :

당신은 OK취소 버튼은 JTextArea 아닌 상측 구성 요소와 정렬되어, 당신이 링크 된 튜토리얼에서 발견 했습니까?

GridBagLayout으로 작업하는 경우 추가 할 각 구성 요소에 대해 GridBagConstraint을 새로 설치하는 것이 좋습니다. 어딘가에 속성을 재설정하는 것을 잊어 버리지 않으므로 문제를 해결하기 어렵습니다. 상위 구성 요소 하나, 당신의 버튼을 사용하여 다른 하나를 다음

, 당신이 당신의 OK취소 버튼 중앙 정렬하여 상위 구성 요소와 함께하고 싶다면, 가장 쉬운 두 JPanel을 생성하는 것입니다. 상단 패널에는 여전히 GridBagLayout을 사용할 수 있으며 버튼에는 기본 패널 (FlowLayout)을 사용할 수 있습니다.BorderLayout 위치에 CENTERSOUTH을 넣으면 좋을 것입니다. 패널 센터 정렬 것이라고 참고 OK/사이 아닌 공간 버튼과 </> 취소 버튼. 위로 문제에 대한 솔루션

: 당신은 너무 세포는 실제로 1.0weightx 세트 첫 번째 (또는 마지막) 줄에 "빈"구성 요소 (Container, JPanel, emtpy JLabel, ...)를 추가해야 X 방향으로 채워지고 weighty0.0으로 설정되어 있기 때문에 Y 방향에서는 보이지 않습니다 (gridwidth 대신 gridheight을 사용하려는 경우).

... 
setLayout(new GridBagLayout()); 

setConstraints(1, 0, GridBagConstraints.BOTH, null); 
addToFrame(new Container(), 0, 0, 1, 1, GridBagConstraints.CENTER); 
addToFrame(new Container(), 1, 0, 1, 1, GridBagConstraints.CENTER); 
addToFrame(new Container(), 2, 0, 1, 1, GridBagConstraints.CENTER); 
addToFrame(new Container(), 3, 0, 1, 1, GridBagConstraints.CENTER); 

// Text areas 
... 

그런 식으로 세포가 존재하고 당신은 예상 된 결과를 얻을 수 있습니다.

Correct alignment