2017-01-05 4 views
0

Ok, also wollte ich ein Box-Layout machen, um es zu testen, und auf der layout help page gibt es an, dass Sie ihm eine Ausrichtung geben können, was ich versuchte, aber es scheint überhaupt nicht zu funktionieren.Boxlayout wird nicht ausgerichtet

package gameflow; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class LoginScreen extends JFrame 
{ 
    private static final Dimension SCREENSIZE = Toolkit.getDefaultToolkit().getScreenSize(); 
    private static final double DEFAULTHEIGHT = (SCREENSIZE.getHeight() * 80)/100; 
    private static final double DEFAULTWIDTH = (SCREENSIZE.getWidth() * 80)/100; 
    private static final long serialVersionUID = -7245840869407664992L; 
    private JTextField userfield = new JTextField(), passfield = new JTextField(); 
    private JLabel userlabel = new JLabel("Username"), passlabel = new JLabel("Password"); 
    private static final Dimension fieldSize = new Dimension(); 

    public LoginScreen() 
    { 
     super("Wraith: the game"); 
     setBounds((SCREENSIZE.width * 10)/100, (SCREENSIZE.height * 10)/100,(int)DEFAULTWIDTH,(int)DEFAULTHEIGHT); 
     fieldSize.setSize((double)this.getWidth()/2,(double)this.getHeight()/30); 

     userfield.setMaximumSize(fieldSize); 
     userfield.setForeground(new Color(1f,1f,1f)); 

     passfield.setMaximumSize(fieldSize); 
     passfield.setForeground(new Color(1f,1f,1f)); 

     userlabel.setMaximumSize(fieldSize); 
     passlabel.setMaximumSize(fieldSize); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 
     panel.setBackground(new Color(0f,0f,0f)); 
     panel.setAlignmentX(0.5f); 

     panel.add(userlabel); 
     panel.add(userfield); 
     panel.add(passlabel); 
     panel.add(passfield); 
     this.add(panel, BorderLayout.CENTER); 
    } 
} 

wie Sie sehen, Platte eine BoxLayout innerhalb des JFrame hat wem ein Border hat, richten sich die Komponenten werden nicht auf die Mitte. Warum?

+0

wie es jetzt ist, haben alle Komponenten die gleiche linke Kante. Der Aufruf von setAlignment on panel wird die einzelnen Komponenten nicht beeinflussen. – MeBigFatGuy

+0

Nun, wie mache ich das dann? – Delupara

+0

Ich würde SpringLayout über BoxLayout nach Formularen suchen. oder sogar miglayout. https://docs.oracle.com/javase/tutorial/uiswing/layout/spring.html – MeBigFatGuy

Antwort

1

Vor allem, wenn Sie erstellen ein Textfeld Sie verwenden sollen:

JTextField textField = new JTextField(10); 

Die Zahl der Komponenten, die eine bevorzugte Größe ermöglicht, zu bestimmen, etwa 10 Zeichen angezeigt werden soll. Die tatsächliche Größe der Komponente kann jedoch vom Layout-Manager bestimmt werden.

Die Komponenten werden nicht mittig ausgerichtet. Warum?

Weil das ist die Regel der BoxLayout. Wenn das Panel zu BorderLayout von JFrame hinzugefügt wird, wird die Größe des Panels so geändert, dass es den gesamten Bereich des Frames ausfüllt. So wissen Sie, die BoxLayout wird die Größe der Komponenten ändern, um den verfügbaren Speicherplatz in seinen Regeln zu füllen.

Zuerst wird jede Komponente in ihrer bevorzugten Höhe angezeigt und zusätzlicher Platz wird einfach an den unteren Rand des Bedienfelds hinzugefügt. Daher erscheinen alle Komponenten am oberen Rand des Rahmens.

Wenn Sie möchten, dass die Komponenten im Panel vertikal zentriert sind, müssen Sie oben und unten auf dem Panel "Leim" hinzufügen. Dann wird leerer Raum oberhalb/unterhalb der Komponenten hinzugefügt, so dass sie zentriert erscheinen. Lies den Tutorial-Link, um mehr darüber zu erfahren, wie "Leim" funktioniert.

Als nächstes werden die Komponenten horizontal angepasst, um die Breite des Panels zu füllen. Eine Komponente wird nur bis zur maximalen Breite gefüllt. Für viele Komponenten (Beschriftung, Schaltfläche ...) ist die maximale Breite die bevorzugte Breite, aber einige Komponenten (Textkomponenten) haben keine maximale Breite.

So die Komponenten zum Zentrum horizontal Sie die Ausrichtung der einzelnen Komponenten festlegen müssen mit:

theComponent.setAlignment(0.5f); 

Für das Textfeld Sie das Textfeld wachsen, indem Sie verhindern können:

textField.setMaximumSize(textField.getPreferredSize()); 

Experimentieren Sie mit diesen Eigenschaften, um den unterschiedlichen Effekt zu sehen.

Nachdem dies alles gesagt wurde, ist die einfachste Möglichkeit, ein Panel (vertikal und horizontal) auf einem Frame zu zentrieren, die Verwendung von GridBagLayout im Inhaltsbereich des Frames. Dann ist der Code nur:

setLayout(new GridBagLayout()); 
add(panel, new GridBagConstraints()); 

und jetzt ist das Panel im Rahmen in seiner bevorzugten Größe zentriert.

Verwandte Themen