Автоматическое изменение размера строк в зависимости от размера шрифта не работает для таблиц JTree - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь автоматически изменить размер таблицы JTree в зависимости от размера шрифта. Я нашел фрагмент кода из inte rnet, который автоматически изменяет размеры строк для обычного JTable, но не работает для таблиц, имеющих реализацию JTree.

Функциональные перерывы для первого столбца. Я предполагаю, что первый столбец содержит древовидную структуру, которая расширяется и сворачивается.

Не могли бы вы, ребята, помочь мне с обходным приемом, чтобы он работал для таблиц JTree?

Ниже приведен мой код из JTreeTable, который выполняет автоматическое изменение размера:

   private Map<Integer, Integer> rowMap = new HashMap<>();
   private boolean quietUpdate = false;
   private boolean forceUpdate = false;

   @Override
   public void paint(Graphics g) {
      super.paint(g);
      this.resizeAndRepaint();
   }

   @Override
   public int getRowHeight(int row) {
       Integer rowHeight = rowMap.get(row);
       if (rowHeight == null) {
           TableColumnModel model = getColumnModel();
           rowHeight = getRowHeight();
           for (int column = 0; column < getColumnCount(); column++) {
               int colWidth = model.getColumn(column).getWidth();
               Component comp = prepareRenderer(this.getCellRenderer(row, column), row, column);
               comp.setSize(new Dimension(colWidth, Integer.MAX_VALUE));
               rowHeight = Math.max(rowHeight, comp.getPreferredSize().height);
           }
           rowMap.put(row, rowHeight);
           quietUpdate = true;
           setRowHeight(row, rowHeight);
           quietUpdate = false;
       }
       return rowHeight;
   }

   @Override
   public void invalidate() {
       rowMap.clear();
       forceUpdate = true;
       super.invalidate();
       forceUpdate = false;
   }

   @Override
   protected void resizeAndRepaint() {
       if (quietUpdate) {
           if (forceUpdate) {
               super.resizeAndRepaint();
           }
       } else {
           super.resizeAndRepaint();
       }
   }
...