我正在为JTable编写一个单元格渲染器,它允许每一行具有不同的高度。对于我表中的每一列,我在表中添加了一个相邻的隐藏列,它只包含行高的int值。我认为当我实现更复杂的调整大小时,这将是低效的并且会产生问题。
有没有办法让主类初始化静态列表,可以通过getTableCellRendererComponent访问?
这是我目前正在做的一个独立的例子:
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class variableRowHeightDemo extends JFrame {
public variableRowHeightDemo() {
JTable vr_table = new JTable();
vr_table.setModel(new DefaultTableModel(
new Object[][]{
{"Height: 30", 30},
{"Height: 60", 60},
{"Height: 90", 90},},
new String[]{
"String", "int height value"
}));
vr_table.setDefaultRenderer(Object.class, new variableRowHeightRenderer());
add(vr_table);
pack();
}
static class variableRowHeightRenderer extends JTextField implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int col) {
// rows heights stored in second invis column
int height = (int) table.getModel().getValueAt(row, 1);
table.setRowHeight(row, height);
this.setText(value.toString());
return this;
}
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new variableRowHeightDemo().setVisible(true);
}
});
}
}
基本上,我想将行高存储在表模型之外,但我不确定如何从子类访问它们而不使行高的列表最终。此外,如果我的实施有任何明显的问题,我将很高兴听到他们。
谢谢,
詹姆斯
答案 0 :(得分:2)
table.setRowHeight(row, height);
不应在渲染器中使用该行代码。您不应该在渲染中更改表的属性。您发布的代码将导致无限循环,因为渲染器更改了高度,然后表重新绘制了行...
基本上,我想将行高存储在表模型之外,
向模型添加数据时使用table.setRowHeight()方法有什么问题?您可以同时更新表格。