2012-03-26 15 views
0

In dem folgenden Code, wenn ein JPanel nicht zur Erweiterung JFrame hinzugefügt wird, funktioniert das Programm gut, aber dann habe ich den JPanel auskommentiert und das GridLayout verwendet, alles ist richtig und schön auf dem JFrame platziert. Könnte es Einschränkungen geben, wie JPanel Objekte anzeigt? Im Code Ich habe die folgenden Aussagen auf Kommentar:Alle JPanel-Einschränkungen in Java?

this.setLayout(new GridLayout(3,2)); 
    this.add(nameLabel); 
    this.add(name); 
    this.add(urlLabel); 
    this.add(url); 
    this.add(typeLabel); 
    this.add(type); 

und das Programm wird falsch angezeigt, aber wenn die Aussagen über unkommentiert sind und die unter kommentiert:

//add some panes.. 
    JPanel panel = new JPanel(); 
    panel.add(nameLabel); 
    panel.add(name); 
    panel.add(urlLabel); 
    panel.add(url); 
    panel.add(typeLabel); 
    panel.add(type); 
    this.add(panel); 

, dann geht das Programm funktioniert gut .. Unten finden Sie den vollständigen Code-Auszug.

[CODE] 

public class FeedInfo extends JFrame { 
    private JLabel nameLabel = new JLabel("Name:", SwingConstants.RIGHT); 
    private JTextField name; 
    private JLabel urlLabel = new JLabel("URL",SwingConstants.RIGHT); 
    private JTextField url; 
    private JLabel typeLabel = new JLabel("Type",SwingConstants.RIGHT); 
    private JTextField type; 


    public FeedInfo() 
     { 
     super("Feed Information"); 
     this.setSize(400,105); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     String response1 = JOptionPane.showInputDialog(null,"Enter the site name:"); 
     name = new JTextField(response1,20); 
     String response2 = JOptionPane.showInputDialog(null,"Enter the site address:"); 
     url = new JTextField(response2, 20); 

     String[] choices ={"Personal","Commercial","Unkown"}; 
     int response3 = JOptionPane.showOptionDialog(null, "what type of site is it?", 
      "site Type",0, JOptionPane.QUESTION_MESSAGE, null, choices, choices[0]); 

     type = new JTextField(choices[response3],20); 
     //add some panes.. 
     JPanel panel = new JPanel(); 
     panel.add(nameLabel); 
     panel.add(name); 
     panel.add(urlLabel); 
     panel.add(url); 
     panel.add(typeLabel); 
     panel.add(type); 
     this.add(panel); 


     /*this.setLayout(new GridLayout(3,2)); 
     this.add(nameLabel); 
     this.add(name); 
     this.add(urlLabel); 
     this.add(url); 
     this.add(typeLabel); 
     this.add(type); 
     */ 

     this.setVisible(true); 

    } 
[/CODE] 
+0

Beachten Sie, dass ein 'GridLayout' nicht gut geeignet ist, um Reihen von Name/Wert-Paaren anzuzeigen. Im Allgemeinen sollte die Spalte mit den Etiketten dünner sein als die mit den Werten. In letzter Zeit würde ich nach 'GroupLayout' suchen, während ich in früheren JREs vielleicht ein verschachteltes Layout verwendet habe. –

Antwort

2
JPanel panel = new JPanel(); 
     panel.add(nameLabel); 
     panel.add(name); 
     panel.add(urlLabel); 
     panel.add(url); 
     panel.add(typeLabel); 
     panel.add(type); 
     this.add(panel); 

Wenn Sie dies tun, den Sie hinzufügen, die JPanel auf das JFrame, aber das Layout der JFrame nicht geändert wird, was bedeutet, es ist standardmäßig Border hat. Versuchen Sie, die letzte Zeile ändern: add(panel, BorderLayout.CENTER); Sie mehr über JFrame lesen here

Auch ein JPanel hat Flowlayout als Standard, was bedeutet, dass Objekte in einer „fließenden Linie“ hinzugefügt werden Sie das Layout auf Ihrer JPanel setzen sollten erhalten Sie das gewünschte Ergebnis

3

JPanel führt kein Layout von selbst, es ist ein LayoutManager verwendet. In Ihrem Fall möchten Sie die Standardeinstellung FlowLayout überschreiben und GridLayout verwenden (genau wie bei Ihrer JFrame). Also mach es!

JPanel panel = new JPanel(new GridLayout(3, 2)); 
... 
+1

JPanels führen das Layout selbst aus. Sie haben standardmäßig ein FlowLayout. – Michael

+0

Sie haben Ihre Antwort trotzdem gewählt, weil es hilfreich wäre, GridLayout zu seinem JPanel hinzuzufügen. – Michael

+0

@Michael: Ihre erste Aussage wird von Ihrem zweiten widerlegt. Ich habe gesagt, dass es kein Layout alleine macht, was wahr ist - es delegiert an einen LayoutManager. FlowLayout ist der Standard-LayoutManager, den es verwendet. Sorry für die Verwirrung, ich habe nicht versucht zu sagen "sie tun nicht Layout standardmäßig." –

1

Es gibt zwei wichtige Fakten zu wissen. JFrame verwendet standardmäßig ein BorderLayout. JPanel verwendet standardmäßig ein Flowlayout. Aus diesem Grund sehen Sie unterschiedliche Verhaltensweisen abhängig davon, welcher Komponente Sie Ihre anderen Komponenten hinzufügen.

FlowLayout ist fast wertlos, also wenn Sie ein JPanel verwenden, möchten Sie es fast immer ändern. @Mark Peters zeigt dir, wie du das oben tun kannst. Ein BorderLayout ist fast immer perfekt für einen Top-Level-Container und ich ändere das selten. Ich neige dazu, BoxLayout fast ausschließlich für meine verschachtelten JPanels zu verwenden.

2

Ihr Programm funktioniert nicht wie erwartet, mit dem zweiten Abschnitt des Codes, weil Sie

JPanel panel = new JPanel();

standardmäßig mit dieser Linie verwenden, wie Sie aus dem JPanel API sehen können, Sie erstellen ein JPanel mit Layout als FlowLayout. Die JPanel API Berichte über das leere contructor:

JPanel() 
Creates a new JPanel with a double buffer and a flow layout. 

Im Allgemeinen ein Fluss Layout ist das einfachste Layout für ein JPanel, und es ist nicht möglich, Swing-Inhalt in einer verständlichen und einfach zu laden. Das GridLayout, das Sie verwenden, bietet die Möglichkeit, die Komponenten in einem Grid zu laden. Das ist gut, um die GUI von Java-Anwendungen anzuzeigen.

Jetzt wissen Sie, weil das Programm mit einem grundlegenden FlowLayout nicht alle Ihre Schwungkomponenten wie erwartet anzeigt, wie im ersten Abschnitt des Codes, wenn Sie ein GridLayout verwenden. Wenn Sie eine JPanel mit einem Gridlayout, geben Sie einfach zu erstellen:

JPanel panel = new JPanel(new GridLayout(3, 2)); 

In this Seite und here gibt es einige Tutorials über JPanel und Layouts.

Verwandte Themen