2016-07-24 33 views
1

Ich lese gerade Kapitel 12 von Head First Java über das Erstellen von GUIs. Sie haben gerade erwähnt, dass JFrames in Mitte, Norden, Süden, Osten und Westen aufgeteilt sind. Das Buch verwendet dann die 2-Argument-Methode add(), um angegebene Komponenten zu einem bestimmten Bereich mit diesem JFrame hinzuzufügen.Hinzufügen von JPanels zu anderen Regionen als CENTER

Ich kann eine JButton zu jeder der fünf Regionen gut hinzufügen. Ich kann auch meine eigene JPanel mit JButtons um die Center-Region herum hinzufügen. Wenn ich dann versuche, ein JPanel zu einer anderen Region als der Mitte hinzuzufügen, wird das JPanel nicht angezeigt.

Ich habe wirklich über das Web und Stack Overflow für die letzte Stunde gesucht und ich habe nichts gefunden, die JPanels zu einer anderen Region als Center in einem JFrame hinzufügen. Meine Frage ist also: Ist es möglich, JPanels zu den nördlichen, südlichen, östlichen oder westlichen Regionen eines JFrames hinzuzufügen?

Vielen Dank im Voraus an jeden, der mir dabei helfen kann. Hier

ist der Code, ich habe versucht, mit meinem JPanel im Norden Region zu laufen:

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.BorderLayout; 

public class StackQ { 

    JFrame frame; 

    public static void main(String [] args) { 

     StackQ gui = new StackQ(); 
     gui.go(); 

    } 

    public void go() { 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JButton button = new JButton("location test"); 
     JButton button2 = new JButton("location test"); 
     JButton button3 = new JButton("location test"); 
     JButton button4 = new JButton("location test"); 

     myDrawPanel custom = new myDrawPanel(); 

     frame.getContentPane().add(button, BorderLayout.CENTER); 
     frame.getContentPane().add(button2, BorderLayout.EAST); 
     frame.getContentPane().add(button3, BorderLayout.WEST); 
     frame.getContentPane().add(button4, BorderLayout.SOUTH); 

     frame.getContentPane().add(custom, BorderLayout.NORTH); 

     frame.setSize(300,300); 
     frame.setVisible(true); 
    } 

} 

class myDrawPanel extends JPanel { 

    public void paintComponent(Graphics g) { 

     int red = (int) (Math.random() * 255); 
     int green = (int) (Math.random() * 255); 
     int blue = (int) (Math.random() * 255); 

     Color random = new Color(red, green, blue); 
     g.setColor(random); 
     g.fillOval(20,20,100,100); 

    } 
} 
+0

Versuchen Sie dieses Tutorial https://docs.oracle.com/javase/tutorial/uiswing/ und genauer https://docs.oracle.com/javase/tutorial/uiswing/components/topevel.html – Aubin

Antwort

2

Es könnte klarer sein, aber dies ist in der BorderLayout Dokumentation beschrieben:

Die Komponenten werden entsprechend ihrer bevorzugten Größe und den Beschränkungen der Größe des Containers ausgelegt .... Die CENTER Komponente kann sowohl horizontal als auch vertikal gedehnt werden, um jeglichen verbleibenden Platz zu füllen.

Anders ausgedrückt, wird die CENTER Komponente (falls erforderlich) gestreckt werden, um die Anwendung zu füllen, und alle anderen Komponenten benötigen eine preferred-size angeben, um etwas von dem von der CENTER zu nehmen.

JButton gibt standardmäßig eine bevorzugte Größe an, basierend auf dem Inhalt der Schaltfläche. JPanel auf der anderen Seite nicht - seine bevorzugte Größe hängt von ihrem Inhalt ab, und Ihre JPanel hat keinen Inhalt, daher ist ihre bevorzugte Größe Null.

Kurz gesagt, geben Sie eine bevorzugte Größe für Ihre JPanel und die BorderLayout wird versuchen, mindestens so viel Platz für das Panel zuzuordnen.

+0

"werde versuchen zuzuteilen": so viel für eine Lösung – gpasch

+0

@gpasch ja; Wenn der 'JFrame' nicht breit genug ist, um die bevorzugte Größe jeder Komponente aufzunehmen, muss etwas gegeben werden. Deshalb ist es eine * bevorzugte * Größe. Solange die 'BorderLayout'-Komponente selbst groß genug ist, um alle ihre Komponenten zu enthalten, werden die bevorzugten Größen respektiert. – dimo414

+0

@ dimo414, vielen Dank für Ihre Antwort. Ich habe zuerst versucht, die setSize() -Methode auf dem JPanel zu verwenden und es würde immer noch nicht im Frame angezeigt. Dann versuchte ich die setPreferredSize() Methode auf dem JPanel in Frage und es erschien in der nördlichen Region des Rahmens! Irgendwelche Ideen, warum die Methode setSize() nicht funktioniert hat? Auch wenn du sagst "Dein JPanel hat keinen Inhalt", zählt die ovale Form, die ich mit Farbe fülle, nicht als Inhalt in einem JPanel? Danke noch einmal! – Wes1324

0

Nur für potenzielle zukünftige Betrachter dieses Beitrags, um das gewünschte Ergebnis zu erhalten, importierte ich zuerst die Dimension-Klasse ganz oben in meiner StackQ-Klasse (dies ist erforderlich, weil die Methode setPreferredSize() später verwendet wird() Methode akzeptiert ein Argument vom Typ Dimension):

import java.awt.Dimension; 

Und dann fügte ich diesen Code auf den Sprung() Methode unmittelbar nach der Instanziierung der myDrawPanel Klasse:

Dimension dims = new Dimension(1366, 200); 
custom.setPreferredSize(dims); 

wählte ich 1366 als die Breite, denn so groß ist mein Bildschirm.

Vielen Dank für Ihre Hilfe!

+0

Versuchen Sie, die Breite bei Null; Da es eine "bevorzugte" Größe ist, verwendet der Layout-Manager nur die Werte, die er benötigt. Wie in der Dokumentation erwähnt, können die "NORTH" - und "SOUTH" -Komponenten horizontal gestreckt werden, wenn die "CENTER" -Komponente breiter ist, als sie benötigen. Für 'NORTH' und' SOUTH' ist die Höhe wichtig. – dimo414