JProgressBar Анимация в таблице - PullRequest
2 голосов
/ 01 марта 2012

У меня есть следующая проблема:

У меня есть 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 миллисекунд потоком свингера, поэтомуне против этого.

Ответы [ 2 ]

5 голосов
/ 01 марта 2012

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

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

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

Редактировать

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

3 голосов
/ 01 марта 2012

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

...