2012-02-21 2 views
3

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

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(); 
    } 
} 
+0

, который от Look and Feel – mKorbel

+0

Я использую jtatoo - http://www.jtattoo.net/ внешний вид. Он имеет внешний вид и выглядит как HiFi, Fast, Acryl, Aero и т. Д.Этот раскрывающийся список состоит из этого списка тем. –

+0

прямо сейчас ваш вопрос понятен, но без кода сгенерирован какой-то вопрос ..... или картинки на ваш вопрос довольно un_answerable, вы только пробовали изменить JTatoo ○ s Темы на лету, ничего не иначе ??? – mKorbel

ответ

2

Решение, вам необходимо переопределить 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(); 
    } 
} 

Спасибо.

+0

Я думаю, что это слишком сложно, пожалуйста, исключая prepareRenderer +1, это все для других вопросов о том, как работает JTable, TableModel – mKorbel

3

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

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

1) перейти к Insubstantial

2) источник загрузки кода,

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

4) поиск для испытания папки, есть Check.java,

5) запустить, что и попробовать все в JMenu выглядеть и чувствовать себя, до того, что требуется для загрузки API, для каждого Custom Java Swing Look and Feels

enter image description here

+0

Я загрузил Insubstantial-insubstantial-insubstantial_7.0-21-gefb2aaf, но не смог найти Check.java. :( –

+0

eeeerggth :-) Я вижу это на https://github.com/Insubstantial/insubstantial/tree/master/substance/src/test/java/test – mKorbel

+0

Я провел 2 с половиной недели, чтобы забрать мой любимый L & F (оригинальная бессонница) – mKorbel

Смежные вопросы