2016-10-27 2 views
0

GridBagLayout을 사용하여 그리드 레이아웃이있는 JPanel과 큰 버튼 만있는 JPanel을 포함하고있는 JFrame을 사용하려고합니다. 행이 모두 같은 크기가되고 JButton이있는 JPanel이 한 행만큼 크기가 좋기를 바랍니다. 그러나 현재 비어있는 버튼 패널은 JFrame의 약 1/3입니다. 무슨 일이 일어나고 있는지 잘 모르겠지만 내 코드의 나머지 부분에서이 구조를 사용하기 때문에이 구조를 유지하는 것이 중요합니다. 어떤 도움을 주셔서 감사 드리며 미리 감사드립니다.GridBagLayout을 사용하여 부적절한 사이징

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

public class Minesweeper extends JPanel { 
     private final int SIZE = 7; 

     public void startGame(){ 
       JFrame holder = new JFrame(); 
       JPanel window = new JPanel(); 
       JPanel pan = new JPanel(); 
       holder.setLayout(new GridBagLayout()); 
       GridBagConstraints con = new GridBagConstraints(); 
       con.weightx = 1; 
       con.weighty = 1; 
       con.gridx = 0; 
       con.gridy = 0; 
       con.fill = GridBagConstraints.BOTH; 
       con.gridheight = SIZE; 
       con.gridwidth = SIZE; 
       holder.getContentPane().setBackground(Color.darkGray); 
       holder.setSize(450, 450); 
       holder.setResizable(false); 
       holder.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       window.setBackground(Color.darkGray); 
       window.setLayout(new GridLayout(SIZE, SIZE)); 
       for (int c=0; c<(SIZE*SIZE); c++){ 
         int row = (c/SIZE); 
         int col = (c%SIZE); 
         JPanel p = new JPanel(); 
         p.setBackground(Color.gray); 
         Border b = BorderFactory.createEtchedBorder(EtchedBorder.RAISED); 
         p.setBorder(b); 
         window.add(p); 
       } 
       holder.add(window, con); 
       con.gridx = 0; 
       con.gridy = SIZE+1; 
       con.gridheight = 0; 
       con.gridwidth = SIZE; 
       holder.add(pan, con); 
       holder.setVisible(true); 
     } 

     public static void main(String[] args){ 
       Minesweeper start = new Minesweeper(); 
       start.startGame(); 
     } 
} 

이 표시되는 것입니다 :

내 코드가 있습니다

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

+0

'JPanel p = new JPanel();'자신과 (사용자) 호의를 베풀어 라. 'JButton p = new JButton();'을 만듭니다. 우리는 버튼에 ActionListener를 추가 할 수 있으며 마우스 클릭과 키보드 액션 모두에 응답합니다. 단추는 또한 아이콘 및/또는 텍스트를 지원합니다 (빈 타일, 지워진 타일, 광산 또는 주변 광산 수 등에 유용합니다). –

+0

사실 이미 jpanels을 사용하는 패널 클래스를 작성했습니다. 목표는 지뢰 찾기 게임이므로 좀 더 조작 할 수 있어야합니다. – acn3

+0

* "그래서 좀 더 조작 할 수 있어야합니다."* 어떻게, 구체적으로? 나는 패널이 할 수있는 일이 없다는 것을 의심한다. –

답변

1
con.gridy = SIZE+1; 

당신은 (8)의 gridy 값을 지정할 수 없습니다 두 그리드에 추가 된 구성 요소. 그리드는 패널 중 하나에 7 행의 구성 요소가 포함된다는 것을 알지 못합니다. 따라서 값은 1이어야합니다.

이 문제는 해결되지 않지만 GridBagLayout 작동 방식에 대한 오해를 해결해야합니다.

holder.setSize(450, 450); 

수동으로 크기를 프레임에 설정하고 있습니다. 각 구성 요소는 원래 기본 크기로 크기가 지정됩니다. 프레임에 여분의 공간이있는 경우 공간은 두 구성 요소간에 균등하게 분배됩니다.

크기를 설정하지 않아야합니다. 각 구성 요소는 자체 크기를 결정해야하며 pack()을 사용해야합니다. 따라서 getPreferredSize() 메서드를 재정의하는 사용자 지정 구성 요소를 사용하여 각 구성 요소에 적절한 크기를 반환해야 pack()이 해당 작업을 수행 할 수 있습니다.

또한 pack()setVisible() 직전에 수행됩니다.

+0

getPreferredSize()를 사용하면 각 JPanel을 getPreferredSize()라는 메서드가있는 클래스 Panel의 객체로 만들면된다고 말하는 것입니까? – acn3

관련 문제