2016-05-10 6 views
0

Ich verwende einen GridBagLayout-Manager, um klar zu definieren, wo (vorerst) Thow-Labels und ein JScrollPane sein sollte.Gibt es eine Möglichkeit, Komponenten PreferredSize zu ignorieren?

Ich benutze gridbagconstraint, um das erste JLabel namens "label1" (mit Text) zu nennen, er sollte 3 Einheiten breit sein * 1 Einheiten groß. Ich sage einem anderen JLabel namens "leer" (leer) er sollte 9 Einheiten breit sein * 1 Einheit groß.

Dann erkläre ich ein JScrollPane, und es sagen, es auf y sein sollte = 1, Höhe = 11 und x = 0 width = 12.

I GridBag der contraint die Füllung auf BEIDE, wollen, weil jede Komponente fülle das Rechteck, das ich beschreibe.

label1 sollte ein Viertel der gesamten verfügbaren Breite sein, aber da label1 Text enthält, benötigt label1 2/3 des Platzes.

Gibt es eine Möglichkeit, die PreferredSizes der Komponenten einfach zu ignorieren, genau wie eine GridLayout (Art von)?

Ich habe die Dokumentation darüber gelesen, aber ich finde keine Ahnung.

Einige Quellcode:

public class JPanelMain { 
    //gridconstraints 
    private GridBagConstraints gbc; 

    private static final int min = 1; 
    private static final int maxSize= 12; 
    private static final int forth =maxSize/4; 
    private static final int third =maxSize/3; 

    public JPanelMain(JFrame frame) { 

     JPanel pane = new JPanel(); 
     pane.setLayout(new GridBagLayout()); 

     gbc = new GridBagConstraints(
       0,//gridx 
       0,//gridy 
       0,//gridwidth 
       0,//gridheight 
       1,//weightx 
       1,//weighty 
       GridBagConstraints.CENTER,//anchor 
       GridBagConstraints.BOTH,//fill 
       new Insets(0,0,0,0),//insets 
       0,//padx 
       0//pady 
       ); 


     JLabel label1 = new JLabel(); 
     label1.setBorder(BorderFactory.createTitledBorder("Label1")); 
     JLabel blank = new JLabel(); 
     blank.setBorder(BorderFactory.createTitledBorder("blank")); 

     label1.setOpaque(true); 



     gbc.gridwidth =(third); 
     gbc.gridheight = (min); 

     pane.add(label1,gbc); 
     label1.setText("Label1"); 
     blank.setOpaque(true); 



     gbc.gridx = third; 
     gbc.gridwidth = maxSize -third; 

     pane.add(blank,gbc);  

     gbc.gridy = min; 
     gbc.gridheight = maxSize - min; 
     gbc.gridx= 0; 
     gbc.gridwidth=maxSize; 

     DefaultListModel<String> patients = new DefaultListModel<>(); 
     fill(patients); 
     JList<String> list = new JList<>(patients); 
     pane.add(new JScrollPane(list),gbc); 





     frame.add(pane); 
    } 

    private void fill (DefaultListModel<String> model) { 
     /**/ 
    } 
} 

das Ergebnis ist, wie beschrieben (und es ist die gleiche Höhe): Label with text sized after its prefered size, despite the constraints

ich gelesen habe (und ich glaube, meist verstanden) die example.

Antwort

2

Es gibt kein solches Konzept wie "Einheiten" in GridBagLayout. Eine GBL verwendet Zellen.

Wenn Sie zwei Komponenten in der ersten Zeile haben, dann haben Sie zwei Zellen. Jede Zelle wird nach der Komponente in der Zelle sortiert.

Wenn Sie dann eine Komponente in der zweiten Reihe haben, haben Sie ein paar Optionen. Die Komponente könnte in der ersten oder zweiten Spalte angezeigt werden. Oder Sie könnten der Komponente eine "gridwidth" von 2 geben, was bedeutet, dass sie die Breite der beiden Spalten füllt.

Sie könnten die Einschränkung "weightx" verwenden. Es gibt an, wie Speicherplatz einer Komponente zugewiesen werden soll, wenn zusätzlicher Speicherplatz verfügbar ist. Wenn also eine Komponente .20 und die andere .80 sein könnte. Dies ist der beste Weg, um Platz proportional zuzuweisen, dies gilt jedoch nur für die "Extra" -Räume. Jede Komponente wird ursprünglich in ihrer bevorzugten Größe bemessen.

Wenn Sie wirklich relative Größen möchten, dann können Sie die Relative Layout verwenden. Es ermöglicht Ihnen, die Größe der Komponenten relativ zum verfügbaren Gesamtspeicherplatz anzugeben, sodass die bevorzugte Größe ignoriert werden kann.

Sie müssten also ein Bedienfeld erstellen, das die RelativeLayout für die erste Zeile verwendet, die die zwei Beschriftungen enthält, und dieses Panel dann mithilfe von GridBagLayout dem Bedienfeld hinzufügen.

+0

Wenn ich "2 Einheiten breit" sage, bedeutet das nur, dass ich die Beschränkung auf gridwidth = 2 setze, wie im Code beschrieben. Ich nahm an, es wäre verständlich. kann ich sagen, "verwalte keine zusätzlichen Leerzeichen?" zu meinem Gridbaglayout? –

+0

Wieder können Sie das nicht tun. Wie ich gesagt habe, müssen Sie mit "Zellen" arbeiten. Die "Gridwidth" bezieht sich nur auf die maximale Anzahl von Komponenten in einer einzelnen Zeile. In Ihrem Beispiel haben Sie 3 Komponenten, 2 in einer Reihe und 1 in einer zweiten. Daher kann nur die zweite Zeile die Beschränkung "gridwidth" verwenden und sie kann nur maximal 2, nicht 9 sein. Siehe update für 'RelativeLayout'. – camickr

+0

scheint es, dass dieses relative Layout tatsächlich _exactly_ ist, was ich brauche, vielen Dank. Aber ich bin ziemlich enttäuscht, dass ich dieses Gitterbaglayout-Ding nicht bekomme ... –