Swing JTable - Невозможно перекрасить и изменить фон ячеек - PullRequest
0 голосов
/ 30 апреля 2011

Hy каждый,

Я пытаюсь выполнить некоторые вычисления в JTable после итерации и пометить различным фоном нужные мне ячейки.

Однако у меня сейчас 2 проблемы:
1) Ячейки окрашиваются не сразу, а после всего цикла итерации
2) Области не окрашены должным образом - если мне нужно нарисовать таблицу [3, 4] и таблицу [6, 5], она рисует прямоугольник от [3,4] до [6, 5] вместо того, чтобы рисовать только отдельные клетки ,

О проблеме 1: могу ли я вызвать repaint () с приоритетом без необходимости завершать все и JVM решать, когда рисовать? Я пытаюсь сделать fireTableCellUpdated() и fireTableDataChanged(), но они не обновляются.

Здесь есть мой метод визуализации ячеек, который изменяет цвет BG:

public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row,int column) {
    Component renderer = super.getTableCellRendererComponent(
        table, value, isSelected, hasFocus, row, column);

    if(value instanceof Color) {
        Color c = (Color) value;
        renderer.setBackground(c);
        System.out.println("BG change [" + row + ":" + column + "]");
    }

    return renderer;
}

Здесь есть цикл, в котором я рисую свои ячейки одним нажатием кнопки:

for(int paintJ = startIndex; paintJ < endIndex; paintJ++) {
     CrossCellRenderer rend =  (CrossCellRenderer) jTable1.getCellRenderer(i,  paintJ)
           .getTableCellRendererComponent(jTable1, Color.blue, true, true, i, paintJ);
     crossTableModel.fireTableCellUpdated(i, paintJ);
     jTable1.revalidate();
     jTable1.repaint();
     try {
          Thread.sleep(1000);
     }   catch(InterruptedException ie) {
           System.err.println("Exception sleeping the thread.");
     }
 }

Есть какие-нибудь советы по этому поводу?

1 Ответ

4 голосов
/ 30 апреля 2011

Ненавижу говорить: но ты делаешь это (чего бы ты ни хотел достичь) совершенно неправильно; -)

  • Никогда и никогда не делайте никаких прямых манипуляций / рисования на рендере, вместо этого измените данные модель , и все остальное произойдет автоматически
  • Никогда не вызывайте какие-либо методы fireXX для модели из-за пределов модели, ответственность за уведомление модели лежит исключительно на ней. его слушатели на перемене
  • Никогда-никогда (или очень-очень редко, конечно, не здесь ;-) необходимо вызвать revalidate и / или перекрасить прямо, произойдет автоматически, если модель хорошо себя ведет
  • ....

Лучше всего прочитать учебник Snoracle о том, как использовать таблицы, чтобы полностью понять механизм рендеринга

http://download.oracle.com/javase/tutorial/uiswing/components/table.html

Грубо:

   // change the model, will notify its listeners
   model.setValueAt(....)

   // in a custom renderer, check the value and decorate as appropriate
   public Component getTableCellRendererComponent(....) {
        // ... normal config, f.i. done in super
        Component comp = super.get...
        if (myConditionForSpecialColor(table, value, ...) {
            comp.setBackground(myColor);
        } else {
            comp.setBackground(normalColor);
        }
   }

   // register the custom renderer 
   // per class
   table.setDefaultRenderer(Object.class, myRenderer)
   // or per column
   table.getColumnModel().getColumn(myColumn).setCellRenderer(myRenderer) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...