Итоги строки JTable с цветовой кодировкой

У меня есть 5 JTables в разных формах с произвольным количеством строк, и я хотел бы иметь метку для каждой из них, которая будет показывать мне общее количество строк в этой таблице, а также менять цвет на 3 секунды при изменении количества строк. Цвет должен стать зеленым при увеличении и красным при уменьшении. Как лучше всего реализовать это, чтобы мне не нужно было дублировать слишком много кода в каждой из моих форм?


person user1585643    schedule 28.08.2012    source источник
comment
Если JTable одинаковы, вы можете расширить JTable и переопределить методы, необходимые для придания ему дополнительной функциональности.   -  person The Cat    schedule 28.08.2012
comment
@TheCat нет, вы никогда (в приближении, очень близком к 100%) переопределяете какой-либо JSomething. Кроме того, сама таблица не имеет ничего общего с требованием.   -  person kleopatra    schedule 28.08.2012


Ответы (1)


в основном вы добавляете TableModelListener в модель JTable и при получении событий изменения обновляете соответствующие метки по мере необходимости.

некоторый код:

public class TableModelRowStorage 
    // extends AbstractBean // this is a bean convenience lass  of several binding frameworks
                            // but simple to implement directly  
     implements TableModelListener {

    private int rowCount;

    public TableModelRowStorage(TableModel model) {
        model.addTableModelListener(this);
        this.rowCount = model.getRowCount();
    }
    @Override
    public void tableChanged(TableModelEvent e) {
        if (((TableModel) e.getSource()).getRowCount() != rowCount) {
            int old = rowCount;
            rowCount = ((TableModel) e.getSource()).getRowCount();
            doStuff(old, rowCount);
        }

    }

    protected void doStuff(int oldRowCount, int newRowCount) {
        // here goes what you want to do - all in pseudo-code
        // either directly configuring a label/start timer
        label.setText("RowCount: " + newRowCount);
        label.setForeground(newRowCount - oldRowCount > 0 ? Color.GREEN : Color.RED);
        timer.start();

        // or indirectly by firing a propertyChange
        firePropertyChange("rowCount", oldRowCount, newRowCount);
    }

}
person kleopatra    schedule 28.08.2012
comment
AbstractBean — это класс SwingX. Возможно, вам следует переписать этот фрагмент кода, используя PropertyChangeSupport, хотя цель кода ясна. - person Robin; 28.08.2012
comment
@ Робин .. это наполовину псевдокод .. намеренно. Виноват, что не упомянул об этом :) - person kleopatra; 29.08.2012