Обновить JTable после обновления - PullRequest
3 голосов
/ 21 февраля 2012

У меня есть JTable с пользовательским TableCellRenderer.

public class DateCellRenderer extends DefaultTableCellRenderer {

    private static final long serialVersionUID = 58L;

    public DateCellRenderer() {
        super();
        setHorizontalAlignment(CENTER);     
        setOpaque(true);
    }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {         
        if (value instanceof Date) {
            String date = new SimpleDateFormat("dd-MM-yyyy").format((Date) value);
            setText(date);
        }
        return this;
    }
}

Также в моем приложении у меня есть выпадающее меню, с помощью которого я могу изменить внешний вид. Это раскрывающееся меню находится в родительском фрейме, а таблица - в диалоговом окне. Когда диалог открыт, родительский фрейм недоступен. Поэтому, чтобы изменить внешний вид, я должен сначала закрыть диалог.

Теперь в определенной оболочке, если таблица заполнена какими-то данными, и я изменяю внешний вид родительского фрейма и снова открываю диалоговое окно, тогда столбец, в который я добавил TableCellRenderer, сохраняет прежний внешний вид. Он не обновляется, в то время как другие столбцы отображаются в новом виде.

Я не могу найти проблему и ее решение. Любая помощь заметна.

Примечание. Внешний вид приложения обновляется с помощью следующего фрагмента

javax.swing.UIManager.setLookAndFeel(uiProperties.getThemeModel().getThemeClass());
ComponentFactory.getLibraryFrame().getRootPane().updateUI();
for (int i = 0; i < Frame.getWindows().length; i++) {
    SwingUtilities.updateComponentTreeUI(Frame.getWindows()[i]);
}
for (int i = 0; i < Frame.getFrames().length; i++) {
    SwingUtilities.updateComponentTreeUI(Frame.getFrames()[i]);
}

Заранее спасибо.

В HiFi тема выбрана первой: enter image description here

Затем я изменяю тему на «Быстрая», а второй столбец «Выпущено» не обновляет свой интерфейс: enter image description here

Таблица JTable:

public class MovieSearchResultTable extends BaseTable {

    private static final long serialVersionUID = 45L;

    public MovieSearchResultTable(TableModel tableModel) {
        super(tableModel);
        LibraryLogger.initMessage(getClass().getSimpleName());
    }

    @Override
    public void initialize() {
        setFillsViewportHeight(true);
        setAutoResizeMode(AUTO_RESIZE_OFF);
        getColumnModel().getColumn(1).setCellRenderer(new DateCellRenderer());//if I comment out this line then no problem. but without CellRenderer how could I format a Date, if I use formatted String instead of Date, then the column will not sort!!
    }

    @Override
    public boolean getScrollableTracksViewportWidth() {
        return getPreferredSize().getWidth() < getParent().getWidth();
    }
}

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Я думаю, что не очень хороший L & F, JTable выглядит ... хорошо, но другие составные JComponents не ..., не уверен, что я не трачу свое время, я ухожу, чтобы проверить это, может быть, есть что-то об этом рассказывал на их форуме или документации или BugParades, но ничего из вашего вопроса

есть очень простой способ, и вы можете в любое время проверить, что

1) перейти к Незначительно

2) скачать исходный код,

3) импортировать все классы в IDE (2-15 мин зависит от аппаратного обеспечения ПК)

4) поиск папок test, есть Check.java,

5) запустите его и попробуйте все в JMenu Look and Feel, перед этим необходимо загрузить API для каждого пользовательского Java Swing Look and Feels

enter image description here

2 голосов
/ 22 февраля 2012

Решение, вам нужно переопределить public Component prepareRenderer(TableCellRenderer renderer, int row, int column)

Вот класс:

public class MovieSearchResultTable extends BaseTable {

    private static final long serialVersionUID = 45L;

    private int rolloverRowIndex = -1;

    public MovieSearchResultTable(TableModel tableModel) {
        super(tableModel);
        LibraryLogger.initMessage(getClass().getSimpleName());
    }   

    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component component = super.prepareRenderer(renderer, row, column);
        Color foreground = getForeground();
        Color background = getBackground();
        if (isRowSelected(row)) {
            foreground = getSelectionForeground();
            background = getSelectionBackground();
        }
        else if (row == rolloverRowIndex) {
            foreground = getSelectionForeground();
            background = ColorHelper.brighter(getSelectionBackground(), 40);
        }
        else if (row % 2 == 0) {
            background = ColorHelper.brighter(getParent().getBackground(), 20);
        }
        component.setForeground(foreground);
        component.setBackground(background);
        return component;
    }

    private class RolloverListener extends MouseInputAdapter {

        public void mouseExited(MouseEvent e) {
            rolloverRowIndex = -1;
            repaint();
        }

        public void mouseMoved(MouseEvent e) {
            int row = rowAtPoint(e.getPoint());
            if (row != rolloverRowIndex) {
                rolloverRowIndex = row;
                repaint();
            }
        }
    }

    @Override
    public void initialize() {
        setFillsViewportHeight(true);
        setAutoResizeMode(AUTO_RESIZE_OFF);
        TableColumnModel tableColumnModel = getColumnModel();
        for(ComponentConstant.ColumnName columnName : ComponentConstant.Column.MOVIE_SEARCH_RESULT_TABLE) {
            int order = columnName.getOrder();
            TableColumn tableColumn = tableColumnModel.getColumn(order); 
            if(order == 0) {
                continue;
            }

            tableColumn.setCellRenderer(RendererFactory.getMovieSearchResultTableCellRenderer());
        }
        RolloverListener listener = new RolloverListener();
        addMouseMotionListener(listener);
        addMouseListener(listener);
    }

    @Override
    public boolean getScrollableTracksViewportWidth() {
        return getPreferredSize().getWidth() < getParent().getWidth();
    }
}

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...