我有一个带有JTable的JDialog。我想要的是一个大小等于表格的对话窗口(如果它没有超过最大尺寸)。在表中,我希望任何单元格的大小为80 * 25像素。这是我现在的代码:
JTable table = new JTable(res, varnames);
table.setRowHeight(25);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
for (int i = 0; i <= nvars; i++) {
table.getColumnModel().getColumn(i).setMinWidth(80);
table.getColumnModel().getColumn(i).setMaxWidth(80);
table.getColumnModel().getColumn(i).setPreferredWidth(80);
}
JScrollPane tableSP = new JScrollPane(table);
out.getContentPane().add(tableSP);
table.setEnabled(false);
out.pack();
out.setVisible(true);
我得到的是一个包含适当大小的表格的对话框。但是对话框本身太大而且空间很大。 怎么办呢?
编辑:发现了导致额外空间的问题。 JScrollPane由于某种原因需要比表本身更多的空间。但我需要ScrollPane作为标题。是一种让它占用更少空间的方法吗?
答案 0 :(得分:1)
您看到的额外区域是scrollPane:它尊重其视图的preferredScrollableViewportSize(如果它实现Scrollable)。普通JTable将该属性作为(相当任意的)硬编码大小返回。所以解决方案是子类化并实现该方法以返回合理的东西,f.i。就visibleRows而言:
JTable table = new JTable(10, 5) {
// make this a property in a custom table
int visibleRows = 10;
/**
* Overridden to exactly fit a given number of rows/columns
*/
@Override
public Dimension getPreferredScrollableViewportSize() {
int height = visibleRows * getRowHeight();
int width = getPreferredSize().width;
return new Dimension(width, height);
}
};
或者使用已经提供属性visibleRows / -Columns的JXTable(SwingX project的一部分)。
答案 1 :(得分:0)
我想要的是一个大小等于表格
的对话窗口
JTable table = new JTable(...);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane( table );
dialog.add( scrollPane );
dialog.pack();
dialog.setVisible( true );