如何解决Line Wrapping Cell Renderer-Java
| 我在实现自定义单元格渲染器时遇到麻烦,该渲染器将在消息内容长度超过一行时自动包装消息内容。以下是我所拥有的:public class MessageTable extends JTable
{
private static MessageTable messageTable;
private DefaultTableModel model = new DefaultTableModel();
private String[] emptyData = {};
private TreeMap<Integer,String> messages = null;
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);
this.setBackground(Color.YELLOW);
int fontHeight = this.getFontMetrics(this.getFont()).getHeight();
int textLength = this.getText().length();
int lines = textLength / this.getColumns() +1;//+1,because we need at least 1 row.
int height = fontHeight * lines;
table.setRowHeight(row,height);
return this;
}
}
public MessageTable()
{
super();
messageTable = this;
this.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
model.addColumn(\"Message Number\",emptyData);
model.addColumn(\"Message Content\",emptyData);
this.setModel(model);
this.setFont(MappingView.theFont);
this.setDefaultRenderer(String.class,new LineWrapCellRenderer());
}
/**
* Set the current messages.
* @param messages
*/
public void setCurrentMessages(TreeMap<Integer,String> messages)
{
clearCurrentMessages();
this.messages = messages;
if (messages != null)
{
for (Integer key : messages.keySet())
{
String[] row = { key.toString(),messages.get(key).toString() };
model.addRow(row);
}
}
}
由于某些原因,从不使用LineWrapCellRenderer,并且行仅包含一行文本。
我究竟做错了什么?
解决方法
不使用您的cellrenderer,因为默认表模型为任何列返回Object.class(它不会覆盖AbstractTableModel的实现):
public Class<?> getColumnClass(int columnIndex) {
return Object.class;
}
因此,要么自己覆盖模型的方法,要么将渲染器分配给“ 2”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。