Я получил JTable, к которому я применил AUTO_RESIZE_LAST_COLUMN. Он автоматически изменяет размер последнего столбца, когда я перетаскиваю столбцы влево или вправо.
Однако JTable привязан к JPanel с менеджером BorderLayout. Когда я изменяю размер JFrame, размер JPanel изменяется, и, поскольку JTable заполняет JPanel, JTable также изменяется. Но когда я изменяю размер JFrame, AUTO_RESIZE_LAST_COLUMN не работает, но вместо этого он изменяет размеры всех столбцов.
Я хочу, чтобы он только auto_resize последний столбец, когда JFrame меняет размер, вместо того чтобы изменять размер всех столбцов.
код:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class JTableResize extends JFrame {
private JTable table;
private JPanel panel;
private JScrollPane pane;
DefaultTableModel model = new DefaultTableModel();
public JTableResize() {
super("JTable - Resize Problem");
setLayout(new BorderLayout());
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBackground(Color.red);
add(panel, BorderLayout.CENTER);
table = new JTable(model);
//panel.add(table);
model.addColumn("Resize");
model.addColumn("Problem");
model.addColumn("........");
model.addColumn("This should resize");
pane = new JScrollPane(table);
panel.add(pane);
//this is supposed to resize last column.. It works when you drag in the columns, but not when frame are resized
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
table.getTableHeader().setReorderingAllowed(false);
table.setShowVerticalLines(false);
for (int i = 0; i <= 50; i++) {
model.addRow(new Object[] {i, i, i, i});
}
}
public static void main(String[] args) {
JTableResize jtr = new JTableResize();
jtr.setSize(500, 500);
jtr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jtr.setVisible(true);
}
}
Ознакомьтесь с документацией API из doLayout()
JTable
.
Перед началом компоновки метод получает resizingColumn tableHeader. Когда метод вызывается в результате изменения размера закрывающего окна, значение resizeColumn равно null. Это означает, что изменение размера произошло "вне" JTable, а изменение - или "дельта" - должно быть распределено по всем столбцам независимо от этого режима автоматического изменения размера JTable.
Поэтому по умолчанию это поведение не поддерживается.
Переопределение метода doLayout() JTable и установка "столбца изменения размера" в последний столбец, похоже, делают трюк:
@Override
public void doLayout()
{
if (tableHeader != null)
{
TableColumn resizingColumn = tableHeader.getResizingColumn();
// Viewport size changed. Increase last columns width
if (resizingColumn == null)
{
TableColumnModel tcm = getColumnModel();
int lastColumn = tcm.getColumnCount() - 1;
tableHeader.setResizingColumn( tcm.getColumn( lastColumn ) ) ;
}
}
super.doLayout();
}