这不存在,或者我没有正确思考/搜索,因为它已经晚了......
我想根据我希望(或知道)存在于特定列中的最大字符串的原型值,在Swing中设置JTable列宽。我不知道像素数,因为我不一定在编译时知道字体。
有没有办法为列宽目的设置原型值,行高的目的是什么?如果是这样,怎么样?
答案 0 :(得分:3)
您可以尝试以下代码:
/**
* Sets the preferred width of the columns of a table from prototypes
* @param table the target table
* @param prototypes an array of prototypes, {@code null} values will be ignored
* @param setMaxWidth {@code true} if the maximum column width should also be set
*/
public static void setWidthFromPrototype(JTable table, Object[] prototypes, boolean setMaxWidth) {
if (prototypes.length != table.getColumnCount())
throw new IllegalArgumentException("The prototypes array should contain exactly one element per table column");
for (int i = 0; i < prototypes.length; i++) {
if (prototypes[i] != null) {
Component proto = table.getCellRenderer(0,i)
.getTableCellRendererComponent(table, prototypes[i], false, false, 0, i);
int prefWidth = (int) proto.getPreferredSize().getWidth() + 1;
table.getColumnModel().getColumn(i).setPreferredWidth(prefWidth);
if (setMaxWidth)
table.getColumnModel().getColumn(i).setMaxWidth(prefWidth);
}
}
}
答案 1 :(得分:1)
您是否尝试在运行时创建JLabel并使用其大小调整表格大小?
// create a label that will be using the run-time font
JLabel prototypeLabel = new JLabel("Not Applicable")
// get the labels preferred sizes
int preferredWidth = prototypeLabel.getPreferredSize().getWidth();
int preferredHeight = prototypeLabel.getPreferredSize().getHeight();
// set the sizes of the table's row and columns
myTable.setRowHeight(preferredHeight);
for(TableColumn column : myTable.getColumnModel.getColumns()){
column.setPreferredWidth(preferredWidth);
}
答案 2 :(得分:1)
SwingX扩展了JXTable / Column支持设置初始列宽大小的原型,您可以在创建列之后这样做
for(int col = 0; ....) {
table.getColumnExt(col).setPrototypeValue(myPrototype[col]
}
或通过实现自定义ColumnFactory来配置创建时的列
ColumnFactory factory = new ColumnFactory() {
@Override
protected void configureTableColumn(TableModel model, TableColumnExt columnExt) {
super(...);
columnExt.setPrototypeValue(myPrototype[columnExt.getModelIndex()];
}
}
table.setColumnFactory(factory);
table.setModel(myModel);
答案 3 :(得分:0)
不是创建Label,而是从TableCellRenderer获取实际组件并测试其大小:
// create the component that will be used to render the cell
Comp prototype = table.getDefaultRenderer(model.getColumnClass(i)).getTableCellRendererComponent(table, "Not Applicable", false, false, 0, i);
// get the labels preferred sizes
int preferredWidth = comp.getPreferredSize().getWidth();
int preferredHeight = comp.getPreferredSize().getHeight();
这是一个单列示例,您需要重复此操作以获取每列的大小(并设置它)。有关此示例,请参阅http://www.exampledepot.com/egs/javax.swing.table/PackCol.html。
答案 4 :(得分:-1)
如果在编译时不知道字体,那么任何JTable列的宽度总是未知的。作为完整性检查,打开文本文档并使用不同的字体进行播放,同时保持点大小不变。所写内容的长度因字体而异,但高度不同。
应该可以确定任何字体大小(以磅为单位)的JTable行的高度,因为它是defined standard。但是,考虑到JTable可能会在单元格之间留出一点间距,这可能需要一些实验。
如果你不能在编译时保证字体大小和字体本身,那么我对其他人想出的答案感兴趣:)