2 Stimmen

Java Swing GridBagLayout

Ich schreibe eine Java-GUI, um Papierkram zu imitieren, insbesondere ein Formular, das eine Anzahl von "Zeilen" hat, die nur zur Laufzeit bekannt sind, und die Zeilen sind entweder in zwei geteilt (50%-50%, ein Etikett und ein Eintrag) oder geteilt 25% 75%, (sagen wir eine Zahl und einen ganzen Satz).

Man sollte meinen, dass mit der Aussage (hier nur die wichtigsten Zeilen, vollständigerer Code unten)

GridBagConstraints c = new GridBagConstraints();
...
c.gridx = 0;
c.gridwidth = 2;
...
mainPanel.add(l, c);

gefolgt von:

c.gridx = 2;
c.gridwidth = 4;
...
mainPanel.add(l, c);

würde "feststellen", dass die Platte in x-Richtung in 4 Teile geteilt ist, wodurch ich meine 50-50-Version erhalte, die mir die Freiheit lassen sollte, dies zu tun, um meine 25%-75%-Version zu erhalten:

GridBagConstraints c = new GridBagConstraints();
...
c.gridx = 0;
c.gridwidth = 1;
...
mainPanel.add(l, c);

gefolgt von:

c.gridx = 1;
c.gridwidth = 3;
...
mainPanel.add(l, c);

Aber was ich bekomme, ist, dass alle Zeilen 50-50 geteilt werden. I war Wir haben es geschafft, dass die Linien 50-50 geteilt wurden und andere nicht, was für eine vorläufige Version in Ordnung war.

Habe ich das hier falsch verstanden? In der Seitenleiste "Ähnliche Fragen" sehe ich diesen Beitrag (http://stackoverflow.com/questions/7509781/java-gridbaglayout-automated-construction), in dem das MiG-Layout empfohlen wird, was ich ernsthaft in Betracht ziehen würde.

Der relevante Code folgt, der Rest des Projekts war eine leere Standard-NetBeans-Java-Desktop-Anwendung:

public class GridBagDemoView extends FrameView {
public GridBagDemoView(SingleFrameApplication app) {
    super(app);

    initComponents();

    // Reset the grid position
    nextGridY = 0;

    addLine_50_50("50", "50");
    addLine_50_50("50", "50");
    addLine_50_50("50", "50");
    addLine_50_50("50", "50");

    addLine_25_75("25", "75");
    addLine_25_75("25", "75");
    addLine_25_75("25", "75");
    addLine_25_75("25", "75");

    mainPanel.validate();
    mainPanel.revalidate();
    mainPanel.repaint();

}

private void addLine_50_50(String left, String right) {

    GridBagConstraints c = new GridBagConstraints();

    // "Universal" settings
    c.fill = GridBagConstraints.HORIZONTAL;
    c.insets = new Insets(5, 5, 5, 5);
    c.anchor = GridBagConstraints.NORTHWEST;
    c.gridheight = 1;
    c.weightx = 1;
    c.weighty = 1;

    // Settings for the labels (LHS of panel)
    JTextArea l = new JTextArea();
    l.setText(left);
    c.gridx = 0;
    c.gridy = nextGridY;
    c.gridwidth = 2;
    c.weightx = 1;
    mainPanel.add(l, c);

    // Settings for the text (RHS of panel)
    JTextArea ta = new JTextArea();
    ta.setText(right);
    c.gridx = 2;
    c.gridy = nextGridY;
    c.gridwidth = 2;
    c.weightx = 1;
    mainPanel.add(ta, c);

    // Increase row number of next line
    nextGridY++;
}

private void addLine_25_75(String left, String right) {

    GridBagConstraints c = new GridBagConstraints();

    // "Universal" settings
    c.fill = GridBagConstraints.HORIZONTAL;
    c.insets = new Insets(5, 5, 5, 5);
    c.anchor = GridBagConstraints.NORTHWEST;
    c.gridheight = 1;
    c.weighty = 1;

    // Settings for the labels (LHS of panel)
    JTextArea l = new JTextArea();
    l.setText(left);
    c.gridx = 0;
    c.gridy = nextGridY;
    c.gridwidth = 1;
    c.weightx = 1;
    mainPanel.add(l, c);

    // Settings for the lext (RHS of panel)

    JTextArea ta = new JTextArea();
    ta.setText(right);
    c.gridx = 1;
    c.gridy = nextGridY;
    c.gridwidth = 3;
    c.weightx = 1;
    mainPanel.add(ta, c);

    // Increase row number of next line
    nextGridY++;

}
Generated code etc...

0voto

Das Grid-Bag-Layout erzwingt nicht, dass die Spalten gleich breit sind, soweit ich weiß. Die erste Spalte hat also wahrscheinlich eine Breite von 50 %, die zweite und dritte Spalte haben eine Breite von 0 oder fast Null, und die vierte Spalte hat wiederum 50 %.

Versuchen Sie, eine Reihe zu erstellen, in der Sie jede der vier Spalten einzeln ausfüllen. Achten Sie darauf, dass Sie die weightx Optionen.

0voto

wzberger Punkte 883

Geben Sie GridBagLayout einen Hinweis, was eine einzelne Zelle ist - fügen Sie einfach einen leeren Bereich für jede einzelne Zelle als erste Zeile hinzu.

gbc.gridx = 0;
gbc.gridwidth = 1;
for (int i=0; i<4; i++)
{  
  container.add(Box.createRigidArea(new Dimension()), gbc);
  gbc.gridx ++;
} 

//now add your rows
gbc.gridx = 0;
...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X