Анимация 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, так что не обращайте на это внимания.


person NotANormalNerd    schedule 01.03.2012    source источник
comment
Почему два оператора return bar?   -  person trashgod    schedule 01.03.2012
comment
Просто чтобы быть уверенным, что он вернется после установки бара в неопределенный режим   -  person NotANormalNerd    schedule 01.03.2012


Ответы (2)


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

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

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

Изменить

проверено: это работает, хотя может выглядеть немного странно из-за множества неопределенных ячеек, которые анимируются "по шагам". Просто будьте осторожны: внутреннее — в делегате пользовательского интерфейса — состояние анимации недокументировано, поэтому могут быть LAF, где оно вообще не работает (например, Substance).

person kleopatra    schedule 01.03.2012
comment
+1 Это было бы хорошим началом рефакторинга. Оригинал слишком запутанный, асимметричный и избыточный, чтобы его можно было отладить путем проверки, по крайней мере, для меня. - person trashgod; 01.03.2012
comment
Спасибо, что сделали это идеально... никогда бы не подумал об этом... большое спасибо еще раз. - person NotANormalNerd; 01.03.2012
comment
пожалуйста, вы знаете о ???, невозможно восстановить это сообщение, как же я ненавижу meta_SO, а то я туда свою просьбу про undelete засунул - person mKorbel; 18.04.2013
comment
@mKorbel понятия не имею, почему это удалено ... единственный вариант - перейти в мета, там всегда весело ;-) - person kleopatra; 18.04.2013
comment
@kleopatra :-) ээээ переносит это решение на fun_factory - person mKorbel; 18.04.2013
comment
@kleopatra ээээргхт, как мы уже говорили, много веселья, обреченного на позор и капризность этого сообщества, ничья 5:5 - person mKorbel; 18.04.2013
comment
@mKorbel спасибо за ссылку, проголосовали и прокомментировали - боюсь, мы больше ничего не можем сделать .. - person kleopatra; 18.04.2013

возможно, у вас есть проблема с параллельным доступом в Swing, в основном там два пути

person mKorbel    schedule 01.03.2012