2017-04-04 2 views
0

Hy, Ich versuche, ein Fenster mit einem Layout wie in diesem Bild zu erstellen: layoutJava verschachtelte Layouts

Meine ide Panels verwenden sollte und Nest-Layout so ähnlich: layout2

Hier ist mein Code so weit, aber es funktioniert nicht richtig. Wie soll ich das machen, was soll ich anders machen oder ist mein Grundkonzept falsch?

package layout; 

import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import javax.swing.*; 
import models.People; 

public class DetailWindow extends JFrame{ 

public DetailWindow(People newPeople) { 
    JFrame frame = new JFrame("Detail Window"); 

    JPanel mainPanel = new JPanel(new GridLayout(1,2)); 
    frame.add(mainPanel); 

    JPanel leftPanel = new JPanel(new GridLayout(2,1)); 
    frame.add(leftPanel); 

    JPanel rightPanel = new JPanel(new GridLayout(3,1)); 
    frame.add(rightPanel); 

    JPanel pictureHolder = new JPanel(new FlowLayout()); 
    pictureHolder.add(new JLabel(new ImageIcon(newPeople.getPic()))); 
    leftPanel.add(pictureHolder); 

    JPanel infoHolder = new JPanel(new GridLayout(6,1)); 
    infoHolder.add(new JTextField(newPeople.getLb_name())); 
    infoHolder.add(new JTextField(newPeople.getName())); 
    infoHolder.add(new JTextField(newPeople.getLb_occup())); 
    infoHolder.add(new JTextField(newPeople.getOccup())); 
    infoHolder.add(new JTextField(newPeople.getLb_BD())); 
    infoHolder.add(new JTextField(newPeople.getBD())); 
    leftPanel.add(infoHolder); 


    rightPanel.add(new JTextField(newPeople.getName())); 
    rightPanel.add(new JTextField(newPeople.getOccup())); 
    rightPanel.add(new JTextField(newPeople.getDetail())); 

    frame.pack(); 
    frame.setSize(600, 400); 
    frame.setLocationRelativeTo(null); // Center the frame 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    frame.show(); 
    } 
} 

(The People ist eine benutzerdefinierte Klasse, und in der Haupt Ich nenne nur die DetailWindow Konstruktor)

Danke für die Hilfe im Voraus!

Antwort

0

Beim Betrachten Ihrer Bilder würde ich das GridBagLayout wie erläutert here verwenden.

Der Grund dafür ist, dass GridBagLayout das einfachste Layout beim Arbeiten mit mehreren Panels ist, es funktioniert auf der gleichen Basis wie eine Basismatrix, um Ihre UI-Elemente zu positionieren, um sie perfekt zu spreizen können Sie einfach einen Spacer verwenden leeres Layout mit einer festen Größe zwischen den Panels.

Auf der anderen Seite gibt es viele brillante IDEs, ich bevorzuge IntelliJ Idee, die eine super UI "Generator" hat und ermöglicht es Ihnen, Ihre UI genau so zu platzieren, wie Sie wollen.

Viel Glück :)

0

Wenn Sie immer zwei kurze und einen langen Text auf der rechten Seite haben, verwenden Sie BorderLayout für das Panel auf der rechten Seite. Fügen Sie den großen Text als BorderLayout.CENTER hinzu und erstellen Sie eine weitere Anzeige (kann GridLayout sein) für die zwei kürzeren Texte oben. Fügen Sie dieses zweite Panel als BorderLayout.NORTH hinzu.

BorderLayout platziert eine große Komponente in der Mitte und vier weitere an den Rändern. GridLayout ist wie eine Tabelle und bietet gleichen Platz für alle Komponenten. Dies ist nicht das Ziel, das Sie erreichen möchten.

Wenn Sie mehrere Komponenten vertikal positionieren müssen, die jeweils nur den benötigten Platz benötigen, müssen Sie das BoxLayout wie gefordert verwenden here.