【发布时间】:2011-03-28 03:35:32
【问题描述】:
我在动态更改行的高度时遇到问题,是否有需要重载的方法?
--编辑--
抱歉,这是我的第一篇短文……我的问题实际上与根据内容更改行高有关。所以到目前为止我所做的是创建了一个实现 TabelCellRenderer 的内部类。
这就是我目前正在做的行高计算。
private static class TextAreaRenderer extends JTextPane implements TableCellRenderer
{
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected,
boolean hasFocus, int row,
int column)
{
/* Setup Code here */
this.setText(((String)value).getEntityName());
int height = new Double(this.getPreferredSize().getHeight()).intValue();
if (table.getRowHeight(row) < height)
table.setRowHeight(row, height);
/* some more code */
return this;
}
}
这是正确的方法吗? 谢谢。
【问题讨论】:
-
不,渲染器不应该改变表格行的高度。这应该在将数据添加到模型时完成。这意味着您将在创建表时进行计算。然后你会使用 TableModelListener 来监听数据的变化,然后重新计算。
-
感谢这是一个更好的解决方案,因为它在数据层和视图层之间创建了分离。此外,我只需将代码放在一个地方,而不必担心每次更改表格布局时都会创建更新代码。
-
@camickr,数据与视图无关。向模型添加数据时应该如何计算高度的行?模型和数据必须独立于视图。 IS 确实是设计的视图部分,应该计算如何将某些数据适合将要显示的任何小部件。我不是说它应该是渲染器,但模型肯定不应该。
-
I'm not saying that it should be the renderer, but for sure the model shouldn't.- 我没有说模型应该这样做。我建议你应该使用 TableModelListener 以便知道数据何时发生变化,然后调用逻辑来重新计算高度。 -
因为我花了 2 天时间才完成这项工作,我尝试了
- TableModelListener 不是解决方案。当模型更改而不是表 GUI 重绘时调用它。在引发模型事件时,表格 GUI 可能(并且根据我的经验永远不会)与模型保持同步。我处理的事情就像在上面的代码中一样(我的问题在这里描述:stackoverflow.com/a/37158209/478765)。我有 1 列 JTable(作为完全行为不端的 JList 的替代品)。这效果很好。