2016-10-27 6 views
0

Ich versuche, ein GridBagLayout zu verwenden, um ein JFrame zu haben, das ein JPanel enthält, das über ein Rasterlayout und ein JPanel mit nur einem großen Button verfügt. Ich möchte, dass alle Zeilen die gleiche Größe haben und dass JPanel mit der JButton dieselbe Größe wie eine Zeile hat. Allerdings ist die Schaltfläche, die derzeit leer ist, etwa 1/3 des JFrame. Ich bin mir nicht ganz sicher, was passiert, aber es ist sehr wichtig für mich, dass ich diese Struktur beibehalte, weil der Rest meines Codes dies verwendet. Jede Hilfe wird geschätzt, und ich danke Ihnen im Voraus.Unsachgemäße Größenanpassung mit GridBagLayout

Dies ist mein Code:

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(); 
     } 
} 

Dies ist, was gezeigt wird:

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

+0

'JPanel p = neues JPanel();' Tun Sie sich (und dem Benutzer) einen Gefallen. Machen Sie das 'JButton p = new JButton();'. Wir können einer Schaltfläche einen 'ActionListener' hinzufügen, der auf Mausklicks und Tastaturaktionen reagiert. Schaltflächen unterstützen auch Symbole und/oder Text (nützlich für leere Kacheln, gelöschte Kacheln, Minen oder Anzahl umgebender Minen usw.) –

+0

Ich habe bereits eine Panel-Klasse geschrieben, die jpanels verwendet. Das Ziel ist ein Minesweeper-Spiel, also muss ich in der Lage sein, sie ein wenig mehr zu manipulieren. – acn3

+0

* "Also muss ich in der Lage sein, sie ein wenig mehr zu manipulieren." * Wie konkret? Ich bezweifle, dass es etwas gibt, was ein Panel tun kann, dass ein Knopf nicht kann. –

Antwort

1
con.gridy = SIZE+1; 

können Sie keinen gridy Wert von 8. Es gibt nur zwei angeben Komponenten zum Raster hinzugefügt. Das Grid weiß nicht, dass eines Ihrer Panels 7 Zeilen von Komponenten enthält. Also sollte der Wert 1 sein.

Dies wird das Problem nicht lösen, sollte aber ein Missverständnis beheben, wie GridBagLayout funktioniert.

holder.setSize(450, 450); 

Sie stellen manuell eine Größe für den Rahmen ein. Jede Komponente hat ursprünglich die Größe ihrer bevorzugten Größe. Wenn im Rahmen mehr Platz ist, wird der Raum gleichmäßig auf die beiden Komponenten verteilt.

Sie sollten nicht die Größe einstellen. Jede Komponente sollte ihre eigene Größe bestimmen und dann sollten Sie pack() verwenden. Sie müssen also benutzerdefinierte Komponenten verwenden, die die getPreferredSize()-Methode überschreiben, um die entsprechende Größe für jede Komponente zurückzugeben, damit pack() ihre Aufgabe erfüllen kann.

Auch die pack() ist kurz vor der setVisible() getan.

+0

Also mit der Sache getPreferredSize(), Sie sagen, dass ich nur jedes JPanel zu einem Objekt einer Klasse Panel machen muss, die eine Methode namens getPreferredSize() hat? – acn3