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 никогда не используется, и строки содержат только одну строку текста.

Что я делаю неправильно?

Ответ №1

Ваш cellrenderer не используется, потому что модель таблицы по умолчанию возвращает Object.class для любого столбца (это не переопределяет реализацию AbstractTableModel):

public Class<?> getColumnClass(int columnIndex) {
return Object.class;
}

Поэтому либо переопределите метод самостоятельно для модели, либо назначьте рендереру Object.class.

Оцените статью
TechArks.Ru
Добавить комментарий