我正在尝试实现 本教程 中所述的自定义 TableRenderer。我想让渲染器对给定单元格的每个文本进行换行。这个想法是,使用 TextArea 作为渲染器,因为它支持换行。但是,以下代码的行为并不像预期的那样:
public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
this.setText((String)value);
this.setWrapStyleWord(true);
this.setLineWrap(true);
return this;
}
}
我设置这个渲染器
table.setDefaultRenderer(String.class, new LineWrapCellRenderer());
但是单元格条目保持未包装状态。如果我将 this.setBackground(Color.YELLOW)
添加到 getTableCellRendererComponent()
方法,所有单元格都按预期显示为黄色,但未包裹。
有任何想法吗?
更新: 正如 Michael Borgwardt 在评论中所说,问题不是换行,而是行高:JTables 行的大小是固定的,所以如果单元格越来越高(因为文本现在是多行的),我们必须增加行高。但是多少钱?我会检查这是否值得另一个 SO 问题。如果没有,我将在此处添加此解决方案。
Update2: 以下代码将确定行高(如果放在 getTableCellRendererComponent()
):
int fontHeight = this.getFontMetrics(this.getFont()).getHeight();
int textLength = this.getText().length();
int lines = textLength / this.getColumns() +1;//+1, cause we need at least 1 row.
int height = fontHeight * lines;
table.setRowHeight(row, height);
原文由 Arvodan 发布,翻译遵循 CC BY-SA 4.0 许可协议
问题是 JTable 中行的高度是固定的,所以这不仅仅是一个包装渲染器的问题;我不确定为什么没有,但如果有,换行的文本将被裁剪——或者这可能正是您所看到的。要调整行高,您需要单独设置它们。
这是一些代码: