2009-05-21 26 views
0

Ich habe einige Probleme mit der Positionierung meiner Label/Passwort-Feld.
Mit diesem Code werden sie beide in der Mitte nebeneinander positioniert, während ich sie eigentlich in der Mitte meines Panels übereinander haben möchte.Positionierung in Java Swing

Weiß jemand, wie ich das tun soll?

import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 

public class Paneel_Pincode extends JPanel { 


    Paneel_Pincode() { 
     setLayout(new FlowLayout()); 

     JPasswordField pincode = new JPasswordField(15); 
     pincode.setLocation(500, 500); 
     JLabel pinInvoer = new JLabel(); 

     ImageIcon pin1 = new ImageIcon("images/voerPincodeIn.jpg"); 

     pinInvoer.setIcon(pin1); 
     pinInvoer.setLocation(500,700); 

     add(pincode); 
     add(pinInvoer); 
    } 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(1000,1000); 
     f.setLocationRelativeTo(null); 

     f.add(new Paneel_Pincode()); 
     f.setVisible(true); 
    } 

} 

Antwort

6

Um den Dreh-Layouts zu erhalten, würde ich ihnen meinen Artikel empfehlen zu lesen (http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/). Es ist alt, aber die Konzepte und wie FlowLayout funktioniert, sind detailliert.

Was meinst du mit "übereinander"?

Wenn Sie meinen, wie

Password 
    <field> 

EDIT: Ich erinnere mich an einem einfacheren Weg, dies zu (vollständig im JDK/JRE) ... (Dies ist ähnlich zu dem, was ich mit den BoxBeans machte unten, aber Sie haben nicht die BoxBeans brauchen. ich BoxBeans erstellt vor langer Zeit BoxLayout in einem UI-Builder in der Lage sein zu verwenden ...)

JLabel label = new JLabel("Password") { 
    @Override public Dimension getMaximumSize() { 
     return super.getPreferredSize(); 
    } 
}; 
JPasswordField field = new JPasswordField() { 
    @Override public Dimension getMaximumSize() { 
     return super.getPreferredSize(); 
    } 
}; 
field.setColumns(10); 
Box verticalBox = Box.createVerticalBox(); 
verticalBox.add(Box.createVerticalGlue()); 
verticalBox.add(label); 
verticalBox.add(field); 
verticalBox.add(Box.createVerticalGlue()); 
// 
Box horizontalBox = Box.createHorizontalBox(); 
horizontalBox.add(Box.createHorizontalGlue()); 
horizontalBox.add(verticalBox); 
horizontalBox.add(Box.createHorizontalGlue()); 
add(horizontalBox); 

Zurück Antwort Referenz ...

Ich empfehle nicht FOLGENDE ABER ES KANN ANDERE LESER MIT IDEEN

Sie können

setLayout(FlowLayout()); 
JPanel group = new JPanel(new BorderLayout()); 
group.add(new JLabel("Password"), BorderLayout.NORTH); 
group.add(passwordField, BorderLayout.SOUTH); 
add(group); 

helfen so etwas wie diese ein kleines Panel in der oberen Mitte des gesamten UI erstellen, die das Kennwort enthält und Feld.

Beachten Sie, dass das geschachtelte BorderLayout sicherstellt, dass das Label und das Feld jeweils ihre bevorzugte Größe erhalten. Sie müssen setColumns auf dem Feld auf die Anzahl der Zeichen setzen, die angezeigt werden sollen.

Wenn Sie das Etikett/Feld vertikal als auch zentrieren möchten, können Sie folgendermaßen vorgehen

setLayout(new GridBagLayout()); 
// 
add(new JLabel("Password"), 
    new GridBagConstraints(0,0,1,1,1,1, 
     GridBagConstraints.SOUTH,GridBagConstraints.NONE, 
     new Insets(3,3,3,3), 0,0)); 
field.setColumns(10); 
add(field, new GridBagConstraints(0,1,1,1,1,1, 
    GridBagConstraints.NORTH,GridBagConstraints.NONE, 
    new Insets(3,3,3,3), 0,0)); 

ich GridBagLayout im allgemeinen Hass mit, so dass ich eine Version mit BoxLayout hinzufügen (aber es ist ein bisschen trickier aufgrund der bevorzugten Größeneinstellungen)

JFrame f = new JFrame(); 
    f.setLayout(new BorderLayout()); 
    // 
    JPanel stuffH = new JPanel(); 
    f.add(stuffH, BorderLayout.CENTER); 
    stuffH.setLayout(new BoxLayout(stuffH, BoxLayout.X_AXIS)); 
    // 
    JPanel stuffV = new JPanel(); 
    stuffV.setLayout(new BoxLayout(stuffV, BoxLayout.Y_AXIS)); 
    // 
    JLabel label = new JLabel("Password"); 
    BoxAdapter labelAdapter = new BoxAdapter(); 
    labelAdapter.add(label); 
    JPasswordField field = new JPasswordField(); 
    field.setColumns(10); 
    BoxAdapter fieldAdapter = new BoxAdapter(); 
    fieldAdapter.add(field); 
    // 
    stuffV.add(new VerticalGlue()); // for vertical spacing 
    stuffV.add(labelAdapter); 
    stuffV.add(fieldAdapter); 
    stuffV.add(new VerticalGlue()); // for vertical spacing 
    // 
    stuffH.add(new HorizontalGlue()); // for horizontal spacing 
    stuffH.add(stuffV); 
    stuffH.add(new HorizontalGlue()); // for horizontal spacing 
    // 
    f.setVisible(true); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

Ein paar Anmerkungen gegeben:

  • ich bin mit meinem B oxBeans Helfer-Klassen - siehe . Diese Seite basiert auf VisualAge für Java, aber das Krug am unteren Rand der Seite kann außerhalb von VAJ verwendet werden. Ich habe es zum Beispiel in Eclipse versucht.
  • AFAICS, Sie können das Layout eines Jframes nicht direkt auf BoxLayout setzen, also habe ich ein zusätzliches Panel dazwischen eingefügt. Es gibt ein Check in BoxLayout, das Probleme mit der automatischen Umleitung des Inhaltsbereichs hat.
  • Ich habe die BoxLayouts so verschachtelt, dass die horizontale Zentrierung (das stuffH-Panel) eine vertikale Zentrierung enthält (das stuffV-Panel). Sie werden zentriert, indem sie mit "Leim" -Komponenten umgeben werden, die einfach Komponenten sind, die sich erweitern können.
  • Ich musste das Etikett und Feld in einem BoxAdapter setzen, der ihre maximale Größe auf ihre bevorzugte Größe beschränkt.Wenn Sie BoxAdapter nicht verwenden möchten, können Sie den gleichen Effekt, indem Sie die folgenden für das Feld und Label acheive:

    JLabel label = new JLabel("Password") { 
        @Override public Dimension getMaximumSize() { 
         return super.getPreferredSize(); 
        } 
    }; 
    JPasswordField field = new JPasswordField() { 
        @Override public Dimension getMaximumSize() { 
         return super.getPreferredSize(); 
        } 
    }; 
    

Hoffnung beweist dies für Sie hilfreich und jemand anderes! - Scott

+0

Ich kam hierher, um Layouts zu empfehlen, aber ich sehe, Sie haben mich dazu geschlagen. +1 –

+0

Ja, das ist es, was ich übereinander gesehen habe. Und ich möchte sie auch vertikal zentrieren :) Versuchte es mit setLocation und setBounds, aber beide haben nicht funktioniert –

+0

Ja das funktioniert super: D Vielen Dank für Ihre Hilfe und Zeit. Ich habe noch nie mit Gridbag gearbeitet, also werde ich es jetzt studieren, damit ich es auch mit meinen anderen Panels verwenden kann. Nochmals, vielen Dank :) –

1

Ich würde das JGoodies FormLayout empfehlen. Sobald Sie es lernen, ist es sehr mächtig und leicht zu Handschrift zu machen.