2017-04-18 7 views
0

내 JPanel에 2 개의 JButton을 넣고 싶습니다. 그 중 하나는 중앙에 있고 다른 하나는 JPanel의 오른쪽 위에 있습니다. JPanel은 JPanel을 포함하는 JFrame과 동일한 크기입니다. 어떻게 GridBagLayout과 GridBagConstraints를 사용하여 이것을 할 수 있습니까? camickrJPanel 상단에 2 개의 JButton을 배치하는 방법 (하나는 중앙에, 다른 하나는 topright)?

SOL'N 고정
public class MyPanel extends JPanel { 
static JFrame frame = new JFrame(); 

public MyPanel() { 
    JButton btnGame1 = new JButton("Game 1"); 
    JButton btnExitFrame = new JButton("Exit");; 

    setLayout(new BorderLayout()); 

    JPanel top = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
    top.add(btnExitFrame); 

    JPanel center = new JPanel(new GridBagLayout()); 
    center.add(btnGame1, new GridBagConstraints()); 

    add(top, BorderLayout.PAGE_START); 
    add(center, BorderLayout.CENTER); 
} 

public static void main(String[] args) { 
    frame.setResizable(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(new MyPanel()); 
    frame.setSize(400, 400); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 
} 

에 대한

public class MyPanel extends JPanel { 
public MyPanel() { 
    JButton btnGame1 = new JButton("Game 1"); 
    JButton btnExitFrame = new JButton("Exit"); 

    setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.anchor = GridBagConstraints.PAGE_START; 
    c.weighty = 1; 
    c.gridx = 0; 
    add(btnGame1, c); 
    c.gridx = 1; 
    c.anchor = GridBagConstraints.FIRST_LINE_END; 
    add(btnExitFrame, c); 
} 

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setResizable(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(new MyPanel()); 
    frame.setSize(400, 400); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 
} 

MCVE :

public class MyPanel extends JPanel { 
    static JFrame frame = new JFrame(); 

    public MyPanel() { 
     JButton btnGame1 = new JButton("Game 1"); 
     JButton btnExitFrame = new JButton("Exit");; 

     int nOfCells = 3; 
     setLayout(new GridBagLayout());   
     GridBagConstraints c = new GridBagConstraints(); 
     c.weightx = 1; 
     c.weighty = 1; 
     for(int i = 0; i < nOfCells; i++){ 
      for(int j = 0; j < nOfCells; j++){ 
       c.gridx = i; 
       c.gridy = j;    
       if(i == 1 && j == 0) { 
        c.anchor = c.PAGE_START; 
        add(btnGame1, c); 
        c.anchor = c.CENTER; 
       } 
       else if(i == 2 && j == 0) { 
        c.anchor = c.FIRST_LINE_END; 
        add(btnExitFrame, c); 
        c.anchor = c.CENTER; 
       } 
       else { 
        c.fill = c.BOTH; 
        add(Box.createRigidArea(new Dimension(frame.getWidth()/nOfCells, frame.getHeight()/nOfCells)), c); 
        c.fill = c.NONE; 
       } 
      } 
     } 

    } 

    public static void main(String[] args) { 
     frame.setResizable(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600, 600); 
     frame.getContentPane().add(new MyPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

image of the fixed text box

답변

2

GridBagLayout을 사용하는 또 다른 옵션은 보이지 않는 Box를 필러로 추가하여 JPanel을 섹션으로 나눈 다음 원하는 위치의 Box를 JButton으로 대체하는 것입니다.

GridBagConstraints c = new GridBagConstraints(); 
    c.weightx = 1; 
    for(int i=0; i<nOfCells; i++){ 
     for(int k=0; k<nOfCells; k++){ 

      c.gridx = i; 
      c.gridy= k; 
      this.add(Box.createRigidArea(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT)), c); 
     } 
    } 

GridBagLayout에이 위치는 공간에 고정하는 것을 허용하지 않습니다, 그들은 JFrame의의 다른 구성 요소에 대한 상대적인 위치에 따라 달라집니다.

+0

nOfCell을 어떻게 정의해야합니까? (프레임에 넣을 버튼이 두 개 있습니다.) – takanuva15

+0

중첩 된 for 루프는 각 방향으로 nOfCells 상자가있는 레이아웃의 격자를 만들었습니다. 선택한 숫자는 프레임을 어떻게 보이게 할 것인지에 달려 있습니다. 정의 된 크기의 nOfCells^2 상자에서 JFrame을 나눠서 상상해보십시오. 어떤 숫자가 더 미학적인지 알 수 있습니다. – Bremsstrahlung

+0

좋아, 나는 3을 3으로 만들 때 찌르다가 펑키했다. MyPanel 생성자를 편집하여 "Game 1"버튼이 JFrame의 상단 중앙에 있고 "Exit"가 상단 오른쪽에 있도록하는 방법을 보여주는 원래 응답 아래에 코드 블록을 붙여 넣을 수 있습니까? – takanuva15

1

하면 프레임의 BorderLayout을 활용하고 중첩 된 패널을 사용합니다.

JPanel top = new JPanel(new FlowLayout(set right alignment)); // read FlowLayout API 
top.add(topRightButton); 

JPanel center = new JPanel(new GridBagLayout()); 
center.add(centerButton, new GridBagConstraints()); 

frame.add(top, BorderLayout.PAGE_START); 
frame.add(center, BorderLayout.CENTER); 

편집 :

그런 정적 변수를 사용하지 마십시오. 정적 변수를 사용해야한다고 생각한다면 디자인 문제가 있습니다.

//setLayout(new GridBagLayout()); 
setLayout(new BorderLayout()); 

... 

//frame.add(top, BorderLayout.PAGE_START); 
//frame.add(center, BorderLayout.CENTER); 
add(top, BorderLayout.PAGE_START); 
add(center, BorderLayout.CENTER); 

당신도에서 섹션을 읽을 수 있습니다 제안 : 당신이 프레임에 직접 MyPanel 클래스를 추가하고 있기 때문에

, 당신은 효과적으로 MyPanel 클래스 BorderLayout가 사용하는 컨테이너 만들기 위해 다음과 같이 변경 필요 How to Use BorderLayout에 대한 스윙 튜토리얼. 데모 코드는 프레임에 직접 구성 요소를 추가하는 또 다른 방법을 보여줍니다.

당신의 현재 코드 (그리고 제가 제안한 위의 변경 사항들)가 아마도 더 나은 접근 방법 일 것입니다. 그러나 레이아웃 관리자가 어떻게 작동하는지 더 잘 이해하려면 두 가지 방법을 모두 이해해야합니다.

+0

음 내가 나가면 종료 버튼이 올바른 위치에 표시되지만 게임 1 버튼은 사라졌습니다. ("오른쪽 맞춤 설정"은'FlowLayout.RIGHT'라고 가정합니다). – takanuva15

+0

@ takanuva15, 게임 버튼이 표시되지 않으면 잘못된 것이 있습니다. 문제를 보여주는이 접근법을 사용하여 [mcve]를 게시하십시오. – camickr

+0

나는 질문에 – takanuva15