Выше я хочу достичь:
- на востоке от
JFrame
находится фиксированная ширина 400JPanel
. - панель использует
GridBagLayout
. - компоненты на этой панели все растягиваются по горизонтали
- последний компонент заполняет дополнительное пространство y
- последний компонент — это
JscrollPane
, обертывающийJTable
.
У меня было много испытаний, все потерпели неудачу:
- Я попытался установить PreferredSize панели, тогда внутренние компоненты не будут растягиваться по горизонтали. (Я знаю, как использовать GridBagConstraints, или мне кажется, что я знаю)
- Я попытался установить размер панели, тогда размер фактически определяется JscrollPane.
- Я пытался деформировать JscrollPane в другой JPanel (потому что я не очень доверяю JScrollPane), бесполезно.
- GridBagContraints.weighty никогда не работает в этом проекте, но хорошо работает в других местах.
Так что я думаю, что проблема с JTable, он всегда делает прокси. 300*300 прямоугольников, как показано красной линией.
Сегодня еще один плохой день с setPreferredSize и setSize в Swing и всеми этими проблемами с размером. Надеюсь, кто-нибудь может помочь, спасибо!
private JPanel buildInfoPanel() {
JPanel panel = new JPanel();
panel.setVisible(false);
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridx = 0;
panel.setLayout(gbl);
label_player = new JLabel("label_player");
label_player.setBackground(Color.RED);
constraints.gridy = 0;
constraints.anchor = GridBagConstraints.NORTH;
gbl.setConstraints(label_player, constraints);
panel.add(label_player);
label_deck = new JLabel("label_deck");
label_deck.setBackground(Color.BLUE);
constraints.gridy++;
gbl.setConstraints(label_deck, constraints);
panel.add(label_deck);
JTable table = new JTable(new ShipTableModel());
table.setAutoCreateRowSorter(true);
table.setFillsViewportHeight(true);
table.getRowSorter().toggleSortOrder(2);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBorder(new LineBorder(Color.red));
constraints.gridy++;
constraints.weighty = 1;
gbl.setConstraints(scrollPane, constraints);
panel.add(scrollPane);
return panel;
}
class ShipTableModel extends AbstractTableModel {
private Ship[] ships = new Ship[0];
private String[] columnNames = {"id", "name", "lv", "hp", "舰队", "舰种", "mId"};
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public int getRowCount() {
return ships.length;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
}