Заголовок Jtable с динамическим переносом строк и автоматической настройкой высоты

Я пытаюсь создать TableCellRenderer для JTable, который:

  • переносить строки для длинных имен
  • автоматическая настройка высоты жатки
  • реагировать на изменение размеров таблицы и столбцов
public class Test {

    public static void main(String[] args) {

        JFrame frame = new JFrame("test frame for line wrapping header table");

        DefaultTableModel tableModel = new DefaultTableModel();
        tableModel.addColumn("column 1");
        tableModel.addColumn("column 2 with a long name");
        tableModel.addColumn("column 3 with a very very very very very long name");

        JTable table = new JTable(tableModel);
        table.getTableHeader().setDefaultRenderer(new Renderer());

        frame.add(new JScrollPane(table));


        frame.setPreferredSize(new Dimension(300,200));
        frame.pack();
        frame.setVisible(true);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}

public class Renderer extends JTextArea implements TableCellRenderer {

    public Renderer() {
        setWrapStyleWord(true);
        setLineWrap(true);
        setBorder( new LineBorder(Color.BLACK, 1));
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
            int row, int column) {

        if (value instanceof String) {
            setText((String) value);
        }

        return this;
    }

}

С этим кодом у меня странное поведение:

  • первая операция изменения размера значительно увеличивает высоту жатки
  • заголовок никогда не восстанавливает свою надлежащую высоту

перед изменением размера

после изменения размера

Я не знаю, как указать правильную высоту для заголовка, и либо это должно быть сделано из CellRenderer, либо нет.

0 ответов

Другие вопросы по тегам