2010-03-29 1 views
23

Ich habe meine Buttons in eine JPane mit GridLayout gelegt. Dann setze ich JPanel mit BoxLayout.Y_AXIS in ein anderes JPanel. Ich möchte, dass die Buttons im GridLayout quadratisch sind. Ich benutze tmp.setSize (30,30) und es funktioniert nicht. Ich versuche auch, new GridLayout(X, Y, 4, 4) zu verwenden, aber ich kann nicht herausfinden, was X und Y sind. Also, was ist der richtige Weg, um dieses Zeug zu machen?Wie kann ich die Größe einer Schaltfläche festlegen?

ZUSÄTZLICH:

Ich kann immer noch nicht das Problem lösen. Hier ist der Code von dem, was ich zu tun versucht:

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

public class PanelModel { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     JPanel firstPanel = new JPanel(); 
     firstPanel.setLayout(new GridLayout(4, 4)); 
     JButton btn; 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(100, 100)); 
       firstPanel.add(btn); 
      } 
     } 

     JPanel secondPanel = new JPanel(); 
     secondPanel.setLayout(new GridLayout(5, 13)); 
     for (int i=1; i<=5; i++) { 
      for (int j=1; j<=13; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(40, 40)); 
       secondPanel.add(btn); 
      } 
     } 

     mainPanel.add(firstPanel); 
     mainPanel.add(secondPanel); 
     frame.add(mainPanel); 

     frame.setSize(400,600); 
     frame.setVisible(true); 
    } 
} 

Das Problem ist, dass Java versucht Breite des firstPanel und secondPanel gleich zu machen! Außerdem versucht Java, die gesamte Höhe des Fensters zu füllen. Wie kann ich dieses Verhalten entfernen?

Antwort

28

Das folgende Bit Code tut, wonach Sie fragen. So stellen Sie sicher, dass Sie genügend Platz zuweisen, so dass der Text auf der Schaltfläche

JFrame frame = new JFrame("test"); 
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
JPanel panel = new JPanel(new GridLayout(4,4,4,4)); 

for(int i=0 ; i<16 ; i++){ 
    JButton btn = new JButton(String.valueOf(i)); 
    btn.setPreferredSize(new Dimension(40, 40)); 
    panel.add(btn); 
} 
frame.setContentPane(panel); 
frame.pack(); 
frame.setVisible(true); 

Die X- und Y sichtbar wird (zwei erste Parameter des Grid Konstruktor) gibt die Anzahl der Zeilen und Spalten in dem Gitter (jeweils) . Sie können eine davon als 0 belassen, wenn Sie möchten, dass dieser Wert unbegrenzt ist.

bearbeiten

Ich habe den bereitgestellten Code geändert und ich glaube, es entspricht nun dem, was gewünscht ist:

JFrame frame = new JFrame("Colored Trails"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

JPanel mainPanel = new JPanel(); 
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

JPanel firstPanel = new JPanel(); 
firstPanel.setLayout(new GridLayout(4, 4)); 
firstPanel.setMaximumSize(new Dimension(400, 400)); 
JButton btn; 
for (int i=1; i<=4; i++) { 
    for (int j=1; j<=4; j++) { 
     btn = new JButton(); 
     btn.setPreferredSize(new Dimension(100, 100)); 
     firstPanel.add(btn); 
    } 
} 

JPanel secondPanel = new JPanel(); 
secondPanel.setLayout(new GridLayout(5, 13)); 
secondPanel.setMaximumSize(new Dimension(520, 200)); 
for (int i=1; i<=5; i++) { 
    for (int j=1; j<=13; j++) { 
     btn = new JButton(); 
     btn.setPreferredSize(new Dimension(40, 40)); 
     secondPanel.add(btn); 
    } 
} 

mainPanel.add(firstPanel); 
mainPanel.add(secondPanel); 
frame.setContentPane(mainPanel); 

frame.setSize(520,600); 
frame.setMinimumSize(new Dimension(520,600)); 
frame.setVisible(true); 

Grundsätzlich stelle ich jetzt die bevorzugte Größe der Platten und eine Mindestgröße für den Rahmen.

+0

Ich habe diesen Code ausprobiert. Es klappt. Aber wenn ich versuche, die gleiche Idee in meinem Programm zu implementieren, funktioniert es nicht. Ich denke, das liegt daran, dass ich mein JPanel (mit dem GridLayout) zu einem anderen JPanel (mit BoxLayout.Y_AXIS) hinzufüge. – Roman

+0

@Roman Wenn Sie genauere Hilfe benötigen, müssen Sie einen Beispielcode posten! – Kris

+0

wie angefordert, habe ich den Code veröffentlicht. – Roman

5

Versuchen Sie mit setPreferredSize anstelle von setSize.

UPDATE:GridLayout nehmen den ganzen Raum in seinem Behälter auf und BoxLayout Nähte alle die Breite in seinem Behälter aufzunehmen, so fügte ich einige Klebstoff-Panels, die unsichtbar sind und nur Platz in Anspruch nehmen, wenn der Benutzer die streckt Fenster. Ich habe das gerade horizontal und nicht vertikal gemacht, aber Sie könnten das auf die gleiche Weise implementieren, wenn Sie es wollen.

Da GridLayout alle Zellen in der gleichen Größe machen, ist es egal, ob sie eine bestimmte Größe haben. Sie müssen stattdessen eine Größe für ihren Container angeben, wie ich es getan habe.

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

public class PanelModel { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     JPanel firstPanel = new JPanel(new GridLayout(4, 4)); 
     firstPanel.setPreferredSize(new Dimension(4*100, 4*100)); 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       firstPanel.add(new JButton()); 
      } 
     } 

     JPanel firstGluePanel = new JPanel(new BorderLayout()); 
     firstGluePanel.add(firstPanel, BorderLayout.WEST); 
     firstGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); 
     firstGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); 

     JPanel secondPanel = new JPanel(new GridLayout(13, 5)); 
     secondPanel.setPreferredSize(new Dimension(5*40, 13*40)); 
     for (int i=1; i<=5; i++) { 
      for (int j=1; j<=13; j++) { 
       secondPanel.add(new JButton()); 
      } 
     } 

     JPanel secondGluePanel = new JPanel(new BorderLayout()); 
     secondGluePanel.add(secondPanel, BorderLayout.WEST); 
     secondGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); 
     secondGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); 

     mainPanel.add(firstGluePanel); 
     mainPanel.add(secondGluePanel); 
     frame.getContentPane().add(mainPanel); 

     //frame.setSize(400,600); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

Compiler schreibt, dass es nicht finden kann Methode namens 'setPreferredSize'. – Roman

2

GridLayout ist oft nicht die beste Wahl für Tasten, obwohl es für Ihre Anwendung sein könnte. Eine gute Referenz ist die tutorial on using Layout Managers. Wenn Sie sich das GridLayout-Beispiel ansehen, sehen Sie, dass die Schaltflächen ein wenig albern aussehen - viel zu groß.

Eine bessere Idee könnte sein, ein FlowLayout für Ihre Schaltflächen zu verwenden, oder wenn Sie genau wissen, was Sie wollen, vielleicht ein GroupLayout. (Sun/Oracle recommend dass GroupLayout oder GridBag-Layout sind besser als GridLayout, wenn Hand-Codierung.)