我有一个JTable,我将AUTO_RESIZE_LAST_COLUMN应用于。当我向左或向右拖动列时,它会自动调整最后一列的大小。
但是,JTable附加到带有BorderLayout管理器的JPanel。当我调整JFrame的大小时,JPanel会调整大小,并且由于JTable填充了JPanel,因此JTable也会调整大小。但是当我调整JFrame的大小时,AUTO_RESIZE_LAST_COLUMN不起作用,而是调整所有列的大小。
当JFrame更改大小时,我希望它仅 auto_resize最后一列,而不是调整所有列的大小。
代码:
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);
}
}
答案 0 :(得分:4)
从doLayout()
的{{1}}方法查看API文档。
在布局开始之前,该方法获取tableHeader的resizingColumn。当由于调整封闭窗口的大小而调用该方法时,resizingColumn为null。这意味着调整大小发生在JTable的“外部”,并且无论JTable的自动调整大小模式如何,都应该将更改 - 或“delta” - 分发到所有列。
因此默认情况下不支持此行为。
覆盖JTable的doLayout()方法并将“resizing column”设置为最后一列似乎可以解决问题:
JTable