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):
ich gelesen habe (und ich glaube, meist verstanden) die example.
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? –
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
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 ... –