2016-10-27 5 views
0

Я пытаюсь использовать GridBagLayout для создания JFrame, который содержит JPanel, который имеет макет сетки и JPanel с помощью только большой кнопки. Я хочу, чтобы все строки были одинакового размера, а JPanel с JButton - того же размера, что и одна строка. Однако панель кнопок, которая в настоящее время пуста, составляет около 1/3 от JFrame. Я не совсем уверен, что происходит, но для меня очень важно, что я поддерживаю эту структуру, потому что остальная часть моего кода использует это. Любая помощь приветствуется, и спасибо заблаговременно.Неправильная калибровка с использованием 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; 

Вы не можете указать Gridy значение 8. Есть только два компоненты добавлены в сетку. Сетка не знает, что одна из ваших панелей содержит 7 рядов компонентов. Поэтому значение должно быть 1.

Это не решит проблему, но должно устранить непонимание того, как работает GridBagLayout.

holder.setSize(450, 450); 

Вы вручную устанавливаете размер кадра. Каждый компонент первоначально имеет размер по своему предпочтительному размеру. Когда в кадре есть дополнительное пространство, пространство распределяется поровну между двумя компонентами.

Вы не должны устанавливать размер. Каждый компонент должен определить свой собственный размер, а затем вы должны использовать pack(). Поэтому вам нужно использовать настраиваемые компоненты, которые переопределяют метод getPreferredSize(), чтобы вернуть соответствующий размер для каждого компонента, чтобы pack() мог выполнять свою работу.

Кроме того, pack() выполнен непосредственно перед setVisible().

+0

Итак, с помощью функции getPreferredSize() вы говорите, что мне просто нужно сделать каждый JPanel объектом класса Panel с методом getPreferredSize()? – acn3

Смежные вопросы