我想创建一个带有单元格换行的swing表,所以我创建了以下使用textarea的渲染器。
问题是如果我在渲染器中使用setRowHeight
方法设置行高,它会创建一个无限循环。我想知道是否有办法实现这一点(细胞系包裹没有无限循环)。
final class RenderTextAreaMessage extends DefaultTableCellRenderer {
JTextArea textareaMessage;
@Override
public Component getTableCellRendererComponent(JTable aTable, Object aNumberValue, boolean aIsSelected,
boolean aHasFocus, int aRow, int aColumn ) {
System.out.println("aa");
String value = (String)aNumberValue;
textareaMessage = new JTextArea();
textareaMessage.setLineWrap(true);
textareaMessage.setWrapStyleWord(true);
textareaMessage.setText(value);
textareaMessage.setBorder(null);
textareaMessage.setMargin(null);
Component renderer = super.getTableCellRendererComponent(
aTable, aNumberValue, aIsSelected, aHasFocus, aRow, aColumn
);
Font fontType = textareaMessage.getFont();
FontMetrics fontMet = textareaMessage.getFontMetrics(fontType);
int fheight = fontMet.getHeight();
int lineCount = textareaMessage.getLineCount();
int rowHeight = lineCount * fheight;
aTable.setRowHeight(aRow,rowHeight+6);
return textareaMessage;
}
}
答案 0 :(得分:2)
我已经创建了一个方法来更新依赖于渲染器当前行高的行高。但要使用它,您需要为渲染器设置正确的高度(可能使用方法setPreferredSize())。当您的表格内容是最新的时,只需调用此方法。
public static void updateRowHeight(JTable table) {
final int rowCount = table.getRowCount();
final int colCount = table.getColumnCount();
for (int i = 0; i < rowCount; i++) {
int maxHeight = 0;
for (int j = 0; j < colCount; j++) {
final TableCellRenderer renderer = table.getCellRenderer(i, j);
maxHeight = Math.max(maxHeight, table.prepareRenderer(renderer, i, j).getPreferredSize().height);
}
table.setRowHeight(i, maxHeight);
}
}