2012-03-01 5 views
2

У меня проблема:JProgressBar Анимация в таблице

У меня есть JTable, которая показывает мне ход выполнения команды. У меня есть 2 команды. Определенные и неопределенные команды.

Если у меня есть только определенные контрольные панели в таблице, прогресс будет показан правильно. , но если у меня есть один определенный прогресс в нем, другой неопределенный не будет анимирован.

Вот мой код:

class ProgressBarRenderer implements TableCellRenderer { 

    /** The bar. */ 
    private JProgressBar bar = new JProgressBar() { 
     public boolean isDisplayable() { 
      return true; 
     }; 
    }; 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     ProgressBarInfo pbi = (ProgressBarInfo) value; 
     if (pbi.getType() == Progress.LS) { 
      if (pbi.getValue() == -1) { 
       bar.setIndeterminate(false); 
       bar.setValue(0); 
       bar.setString("Progress ended"); 
      } else { 
       bar.setIndeterminate(true); 
       bar.setString(pbi.getValue() + " " + pbi.getText()); 
      } 
      bar.setStringPainted(true); 

      return bar; 
     } else if (pbi.getType() == Progress.SCP) { 
      if (pbi.getValue() == -1) { 
       bar.setIndeterminate(false); 
       bar.setValue(0); 
       bar.setString("Progress ended"); 
      } else { 
       bar.setValue(pbi.getValue()); 
       bar.setString(pbi.getValue() + "% " + pbi.getText()); 
      } 
      bar.setIndeterminate(false); 
      bar.setStringPainted(true); 
     } 
     return bar; 
    } 
} 

Таблица обновляется каждые 10 миллисекунд в SwingWorker потоком, так что не возражает об этом.

+0

Почему два утверждения 'return bar'? – trashgod

+0

Просто убедитесь, что он вернется после установки полосы в режим неопределенности – NotANormalNerd

ответ

5

Внутреннее состояние ProgressBar (детерминированный vs. неопределенный) очень отличается - переключение между ними в том же экземпляре может быть причина. Попробуйте использовать один экземпляр для каждого

public class MyRenderer .... 
    JProgressBar determinate; 
    JProgressBar indeterminate; 

    public Component getTableCellRendererComponent(...) { 
     if (value.isDeterminate) { 
      ... 
      return determinate; 
     } 
     .... 
     return undeterminate 
    } 

Edit

проверил: он является работает, хотя может выглядеть немного странно со многими неопределенными клеток, которые анимированными «в шаге». Просто будьте осторожны: внутренняя - в делегате ui - состояние анимации недокументировано, поэтому могут существовать LAF, где он вообще не работает (f.i. Substance, afair).

+0

+1 Это было бы хорошим началом при повторном факторинге. Оригинал слишком запутан, асимметричен и избыточен для отладки путем осмотра, по крайней мере для меня. – trashgod

+0

Спасибо, что сделал это отлично ... никогда бы не подумал об этом ... отлично Спасибо. – NotANormalNerd

+0

[пожалуйста, вы знаете о ???] (http://stackoverflow.com/questions/5898028/what-happened-to-the-substance-laf), невозможно восстановить этот пост, как я ненавижу meta_SO, иначе Я оставил свою просьбу об удалении там – mKorbel