Заголовок Jtable с динамическим переносом строк и автоматической настройкой высоты - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь создать 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, либо нет.

...