2012-02-21 9 views
3

私はカスタムTableCellRendererを持つJTableを持っています。ルック&フィール更新後の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]); 
} 

感謝を作っています。ハイファイのテーマで

最初の選択: enter image description here

をその後、私は高速にテーマを変え、2番目の列は、そのUIを更新していない "リリース": 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

ルックアンドフィールから – mKorbel

+0

私はjtatoo - http://www.jtattoo.net/ルックアンドフィールを使用しています。それは、サブ外観を持っていて、HiFi、Fast、Acryl、Aeroなどのように感じます。そのドロップダウンはこれらのテーマのリストで構成されています。 –

+0

あなたの質問は明らかですが、コードなしでいくつかの問題が発生しました.....または写真はあなたの質問です。かなりun_answerable、JTatoo○sのテーマを変更しようとしましたか? – mKorbel

答えて

2

のためのソリューションをAPIをダウンロードするために必要な前に、ルックアンドフィールJMenuの中ですべてのものを試して、あなたはここで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のように見えます...しかし、他の化合物JComponentsは....、私は私の時間を無駄にしていないかわからないAVINGは多分非常に単純な方法がある

あなたの質問から、彼らのフォーラムやドキュメントまたはBugParadesにそのことについて説明した何か、何もがあり、それをテストするために、あなたはどの時間が

1)に行くことを確認することができますInsubstantial

2)ダウンロードコードソース、

3)IDEにすべてのクラスをインポート(2-15分はPCのハードウェア)

4)フォルダのテストを探しに依存、Check.javaがあり、

5)それを実行し、それがすべての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

で見ることができます。 L&F(元の不眠症) – mKorbel

関連する問題