Java Swing GridBagLayout - PullRequest
       7

Java Swing GridBagLayout

2 голосов
/ 11 декабря 2011

Я пишу графический интерфейс Java, чтобы имитировать некоторые документы, в частности форму, которая имеет ряд «строк», известных только во время выполнения, и строки либо делятся на две (50% -50%, метка и запись) или разделить 25% на 75% (скажем, число и полное предложение).

Можно было бы подумать, что сказав (просто показывая существенные строки здесь, более полный код ниже)

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

с последующим:

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

"установит", что в направлении х панель разделена на 4, что дает мне 50-50, что должно сделать меня свободным, чтобы получить версию с 25% -75%:

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

с последующим:

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

Но я получаю все строки, разделенные на 50-50. Я был в состоянии разделить строки на 50-50, а затем и на другие, не разделенные, что было хорошо для предварительной версии.

Я неправильно понял, как это работает здесь? Я отмечаю на боковой панели «Похожие вопросы» этот пост (/4509206/java-gridbaglayout-avtomatizirovannaya-konstruktsiya), рекомендующий макет MiG, который я бы серьезно рассмотрел.

Ниже приведен соответствующий код, остальная часть проекта представляла собой стандартное пустое настольное Java-приложение NetBeans:

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...

Ответы [ 2 ]

0 голосов
/ 11 декабря 2011

Дайте GridBagLayout подсказку о том, что такое отдельная ячейка - просто добавьте пустую область для каждой отдельной ячейки в качестве первой строки.

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;
...
0 голосов
/ 11 декабря 2011

Насколько я знаю, компоновка мешка не заставляет столбцы иметь одинаковую ширину.Так что вы, вероятно, получите, что ваш первый столбец имеет ширину 50%, второй и третий столбцы имеют ширину 0 или почти нулевую, а четвертый столбец снова равен 50%.

Попробуйте создать строку, где вызаполните каждый из четырех столбцов отдельно.Обязательно используйте опции weightx.

...