2016-04-06 13 views
0

Ich habe einen Passwortgenerator in Java erstellt, der perfekt funktioniert. Meine Funktionalität funktioniert (nach vielen Tränen, Schweiß und Blut :)), aber das einzige Problem, das bleibt, ist das Layout meiner GUI.BorderLayout in Swing Java funktioniert nicht richtig

Mein Ansatz war die folgende:

  • 1 Scheibe (Top/Nord) für den Titel
  • 1 Scheibe in der Mitte für das Formular
  • 1 Scheibe (unten/Süd) für die Tasten und Textfeld

Dies ist das Ergebnis

enter image description here

wie Sie sehen können, ist das nicht, wie ich es wollte. Aber wenn ich meinen Code anschaue, sollte er gut von oben nach unten platziert werden.

Wo ist es schiefgelaufen?

Mein Code:

Die Konstruktor (erstreckt sich von JFrame)

public PasswordGenerator(){ 
    this.setContentPane(ContentPane()); 
    this.setSize(500,270); 
    this.setResizable(true); 
    this.setVisible(true); 
} 

Die Scheiben:

private JPanel ContentPane() 
{ 
    JPanel ContentPane = new JPanel(); 
    ContentPane.add(getTopPane(), BorderLayout.NORTH); 
    ContentPane.add(getCenterPane(),BorderLayout.CENTER); 
    ContentPane.add(getSouthPane(),BorderLayout.EAST); 
    return ContentPane; 
} 

private JPanel getTopPane(){ 
    JPanel TopPane = new JPanel(); 
    JLabel intro = new JLabel("Password generator V1.0"); 
    intro.setFont(new Font("TimesRoman",Font.BOLD,20)); 
    TopPane.setLayout(new GridLayout(1,1)); 
    TopPane.add(intro); 
    return TopPane; 
} 

private JPanel getCenterPane(){ 
    JPanel CenterPane = new JPanel(); 

    CenterPane.add(aantalChars); 
    CenterPane.setLayout(new GridLayout(6,3)); 
    //8,2 
    hidden.setVisible(false); 
    hiddenL.setVisible(false); 
    CenterPane.add(aantalCharsLabel); 
    CenterPane.add(hidden); 
    CenterPane.add(hidden); 
    CenterPane.add(hiddenL); 
    CenterPane.add(lowerCase); 
    CenterPane.add(lowerCaseLabel); 
    CenterPane.add(upperCase); 
    CenterPane.add(upperCaseLabel); 
    CenterPane.add(numberCase); 
    CenterPane.add(numberCaseLabel); 
    CenterPane.add(symbolCase); 
    CenterPane.add(symbolCaseLabel); 


    return CenterPane; 
} 
+0

JPanel ein Flowlayout verwendet standardmäßig, einen genaueren Blick auf Ihre ContentPane Methode – MadProgrammer

+0

habe ich versucht, die Methode ContentPane.setLayout (neu Border()), aber es gibt eine noch verrückteres Aussehen der GUI. –

+1

Haben Sie es vor oder nach dem Hinzufügen der Komponenten festgelegt? Sie müssen es einstellen, bevor Sie ihm irgendwelche Komponenten hinzufügen. – MadProgrammer

Antwort

3

Sie haben vergessen, die BorderLayout als LayoutManager auf ContentPane einzustellen. Nur die richtigen Einschränkungen zu verwenden, ist nicht genug. Sie können dafür ContentPane.setLayoutManager() verwenden, oder Sie können LayoutManager direkt im Konstruktor JPanel angeben.

+0

Welche Einschränkungen müssen in der ContentPane.setLayout() verwendet werden? Ich habe gerade versucht (neues BorderLayout()), aber es gibt eine sehr psychedelische Ansicht der GUI. –

+0

'new BorderLayout()' ist in Ordnung. Was meinst du mit psychedelischer Sicht? – Vampire

+0

Ah, vielleicht bedeutet psychedelisch, dass du 'EAST' benutzt hast, wo du' SOUTH' für deine Knopfleiste haben wolltest? – Vampire

2

Der Standard-Layout-Manager für JPanel ist FlowLayout-Manager. BorederLayout nutzen zu können, müssen sie speziell setzen:

private JPanel ContentPane() 
     { 
      JPanel ContentPane = new JPanel(); 
      ////////////////////////////////////////////// 
      ContentPane.setLayout(new BorderLayout()); 
      //////////////////////////////////////////// 
      ContentPane.add(getTopPane(), BorderLayout.NORTH); 
      ContentPane.add(getCenterPane(),BorderLayout.CENTER); 
      ContentPane.add(getSouthPane(),BorderLayout.SOUTH); 
      return ContentPane; 
     }