2016-07-20 18 views
-1

enter image description here Ich habe ein oberes Bedienfeld mit einem Fließschema, das ein Textfeld und ein Etikett enthält. Ich muss mehr Textfelder und Beschriftungen unterhalb der ersten Zeile hinzufügen. Ich erkannte, dass es keine wirkliche Möglichkeit gab, eine neue Linie im Flowlayout zu erzwingen, also wollte ich nur ein neues Panel erstellen und es unter das oberste legen. Das Problem ist jetzt eine Lücke, weil die Höhe der oberen Platten zu groß ist. Gibt es eine Möglichkeit, die Größe des Panels so zu ändern, dass seine Breite automatisch an die Bildschirme angepasst wird, aber ich möchte die Höhe des neuen Panels anpassen, sodass die Lücke kleiner ist. Die zwei Textfelder oben sind im oberen Bereich mit einem Flowlayout. Die 3 Textfelder unten sind in einem neuen Panel mit einem Flowlayout, gibt es eine Möglichkeit, die 3 Textfelder unter die 2 Textfelder oben zu bringen? Auch der gesamte Rahmen ist in einem Raster angeordnet.Einstellen der Höhe eines JPanels

frame.setLayout(new GridLayout(0,1)); 
Static JPanel topPanel = new JPanel(new flowlayout); 
Static JPanel searchPanel = new JPanel(new flowlayout); 
Static JPanel statusPanel = new JPanel(new gridLayout(2,1)); 
Static JPanel categoryPanel = new JPanel(new GridLayout(0.2)); 
Static JPanel btnPanel = new JPanel(new GridLayout(0,3)); 
frame.pack(); 
topPanel.add(searchPanel); 
JPanel container2 = new JPanel(new BorderLayout()): 
container2.add(topPanel, BorderLayout.North); 
frame.getContentPane().add(container2); 
frame.getContentPane().add(statusPanel); 
frame.getContentPane().add(catergoryPanel); 
frame.getContentPane().add(btnPanel); 
+1

* "Alle Empfehlungen?" * 1) [ 'pack()'] (http://docs.oracle.com/javase/8/docs/api/java/awt/Window.html#pack -) 2) Um eine bessere Hilfe zu erhalten, sollten Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) veröffentlichen. 3) Bereitstellung von ASCII-Grafiken oder einer einfachen Zeichnung des * vorgesehenen * Layouts der GUI in minimaler Größe und wenn sie in der Größe veränderbar ist, mit mehr Breite und Höhe. –

+0

Im mit pack, und ich habe ein Bild zum besseren Verständnis hinzugefügt. Danke –

+0

* "Im mit pack, .." * Ist dieser Rahmen maximiert? BTW - Wo ist das ASCII-Art/Zeichnungen wie in meinem Kommentar beschrieben? –

Antwort

3

Die JPanel mit den GridLayout ist das Problem - es wahrscheinlich zu BorderLayout.CENTER des Behälters ist und deshalb reicht es über den gesamten verfügbaren Platz. Es hat auch gleiche Zellgrößen. Wickeln Sie entweder das Gitter in eine BorderLayout und fügen Sie es zu BorderLayout.NORTH hinzu oder verwenden Sie eine GridBagLayout für die Platten.


enter image description here

Hier ist ein Beispiel, das in Ihrem Beispiel zeigt, wie werden die Platten gelegt und wie die in anderen Layouts angelegt. Ich denke, das wird deutlich machen, warum sich Ihre GridLayout auf diese Weise verhielt.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Insets; 

import javax.swing.BorderFactory; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Example { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Example(); 
      } 
     }); 
    } 

    public Example() { 

     // GridLayout 

     JPanel container1 = new JPanel(new GridLayout(2, 1)); 
     container1.add(createExamplePanel()); 
     container1.add(createExamplePanel()); 

     // GridLayout inside BorderLayut (NORTH) 

     JPanel panel = new JPanel(new GridLayout(2, 1, 0, 5 /* margin */)); // You could also use other layouts here, e.g. a BoxLayout 
     panel.add(createExamplePanel()); 
     panel.add(createExamplePanel()); 
     JPanel container2 = new JPanel(new BorderLayout()); 
     container2.add(panel, BorderLayout.NORTH); 

     // GridBagLayout 

     JPanel container3 = new JPanel(new GridBagLayout()); 
     GridBagConstraints constraints = new GridBagConstraints(); 
     constraints.anchor = GridBagConstraints.PAGE_START; 
     constraints.fill = GridBagConstraints.HORIZONTAL; 
     constraints.insets = new Insets(0, 0, 5 /* margin */, 0); 
     constraints.weightx = 1.0; 
     container3.add(createExamplePanel(), constraints); 
     constraints.gridy = 1; 
     constraints.weighty = 1.0; 
     constraints.insets = new Insets(0, 0, 0, 0); 
     container3.add(createExamplePanel(), constraints); 

     JPanel contentPane = new JPanel(new GridLayout(1, 3, 5, 5)); 
     contentPane.add(createTitledPanel(container1, "GridLayout")); 
     contentPane.add(createTitledPanel(container2, "GridLayout inside BorderLayout (NORTH)")); 
     contentPane.add(createTitledPanel(container3, "GridBagLayout")); 

     JFrame frame = new JFrame("Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(contentPane); 
     frame.setSize(800, 600); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private JPanel createTitledPanel(JComponent content, String title) { 
     JPanel panel = new JPanel(new BorderLayout()); 
     panel.add(content); 
     panel.setBorder(BorderFactory.createTitledBorder(title)); 
     return panel; 
    } 

    private JPanel createExamplePanel() { 
     JPanel panel = new JPanel(); 
     panel.add(new JLabel("Panel")); 
     panel.setBorder(BorderFactory.createLineBorder(Color.GRAY)); 
     return panel; 
    } 

} 
+0

Danke für die ausführliche Antwort! Eine Frage, wenn ich zwei weitere Panels unter den ursprünglichen zwei habe, sollte ich das Layout für das untere Panel nach Süden legen? –

+0

Okay, ich habe getan, was Sie gesagt haben, und jetzt sind die Textfelder direkt unter den ersten Textfeldern, aber der untere Teil von ihnen wird abgeschnitten. Hier ist, was ich getan habe: topPanel.add (searchPanel); JPanel container2 = neues JPanel (neues BorderLayout()); container2.add (topPanel, BorderLayout.NORTH); Dann habe ich den Container zum Rahmen hinzugefügt. Ich verwende eine Rasteranordnung von (0,1) sollte sich das ändern? –

+1

@ B.minnick Bitte bearbeiten Sie Ihre Frage und fügen Sie eine ausführbare [mcve]. Leider kann ich das Problem, das Sie beschreiben, nicht reproduzieren. –

Verwandte Themen