Линия Обтекания Линии - Java - PullRequest
1 голос
/ 14 апреля 2011

У меня возникли проблемы с реализацией пользовательского средства визуализации ячеек, которое будет переносить содержимое сообщения, если его длина превышает одну строку. Вот что у меня есть:

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 Ответ

1 голос
/ 14 апреля 2011

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

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

Так что либо переопределите метод для модели самостоятельно, либо назначьте средство визуализации на Object.class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...