Я пишу графический интерфейс 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...