Почему мой JTable CellRenderer работает постоянно? - PullRequest
3 голосов
/ 27 декабря 2010

// вопрос новичка

У меня есть JTable с почти базовым средством визуализации ячеек (оно по-разному окрашивает линию). Я заметил, что мой рендерер ячеек постоянно работает для линий, которые отображаются на экране, даже когда я ничего не делаю с таблицей.

Это так и должно быть? Разве он не должен визуализировать каждую ячейку по одному разу, и все? Как я могу остановить его и пересчитать только при изменении?

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

   log.debug("Building cell : " + row + "," + column);

   Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

   Filter filter = (Filter)table.getModel().getValueAt(row, Column.CLASSIFICATION.getIndex());
   comp.setBackground(filter.getColor());
   return comp;

  }

Ответы [ 4 ]

3 голосов
/ 29 декабря 2010

Следуя предложению @Steve McLeod, я начал создавать пример кода с той же ошибкой, и только тогда я понял, что внутри одного из моих CellRenderers

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

        log.debug("Building a list for " + row + "," + column);
        setListData(((Vector<String>)value).toArray());     
        setToolTipText("This is a tool tip for " + row + "," + column);

        table.setRowHeight(row, Math.max(1, getPreferredSize().height));
        Filter filter = (Filter)table.getModel().getValueAt(row, Column.CLASSIFICATION_RESULT.getIndex());
        setBackground(filter.getColor());       
        return this;
    }

у меня была строка:

table.setRowHeight(row, Math.max(1, getPreferredSize().height));

и это постоянно меняло линию строки, в то время как другие средства визуализации в той же строке делали то же самое ... поэтому они постоянно стреляли друг в друга.

1 голос
/ 27 декабря 2010

Я работал лот с JTables, содержащими лот данных.Больше, чем обычно манипулируют 99,9% программистов на Java.Есть одна вещь, которую вам нужно знать: по умолчанию генерируется безумное количество отходов и обычно выполняется безумное количество ненужных операций.

Если вам нужны быстрые и эффективные JTables, тогда the авторитетная статья Sun на эту тему:

"Приложения на елку, как создавать часто обновляемые JTables, которые хорошо работают"

Обратите внимание на ", чтоPerform Well " в названии, потому что по умолчанию перфекты JTable действительно очень-очень патетически плохи:

Original Link (Sun)

Текущая ссылка(Oracle)

Архивная версия:

После реализации двух или трех методов, описанных в этой статье, вы заметите удивительное ускорение рендеринга JTable.и вы заметите, что образуется намного меньше мусора (и, следовательно, GC должен пнуть куда реже).

1 голос
/ 27 декабря 2010

Я заметил, что вы меняете внешний вид ячейки в зависимости от значения другой ячейки.Если эти отношения идут в обе стороны - появление ячейки 1 основано на ячейке 2, и наоборот, вы можете получить такую ​​проблему.Но на самом деле нам нужен автономный пример кода, который воспроизводит проблему - в противном случае мы можем снимать только в темноте.

0 голосов
/ 27 декабря 2010

рендерер уже кэширует ваш обработанный компонент, когда ничего не меняется, ничто не перерисовывается

Однако, когда таблица обнаружит, что МОЖЕТ измениться, она запросит повторный рендеринг. Событие, которое вызывает это больше всего, - движение мыши.

Так что да, это нормальное поведение для JTable.

...