2017-11-07 10 views
0

こんにちは、私はjtableで作業しています。そのため、セルレンダラーを使用して特定の列にCurrencyRenderを適用する必要があります。また、私は各色のイオンを適用しています。完璧なことはすべて起こっていますが、通貨列にcurrencyRendererを適用すると背景色が失われます。これは、通貨のcellrendererを追加することによるものです。通貨レンダラーを使用して列を色分けすることをお勧めします。私のコードレンダラー適用時のJtableセルの色付け方法

this.installAllignment(this.tblDemandView.getColumnModel().getColumn(numAmount), SwingConstants.RIGHT); 
    this.tblDemandView.getTableHeader().setReorderingAllowed(false); 
    this.tblDemandView.getTableHeader().setResizingAllowed(true); 
    tblDemandView.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    NumberFormat _formatf = NumberFormat.getNumberInstance(); 
    _formatf.setMinimumFractionDigits(2); 
    _formatf.setMaximumFractionDigits(2); 

    MyCurrencyRenderer _rendererf = new MyCurrencyRenderer(_formatf); 
    TableColumnModel _model = tblDemandView.getColumnModel(); 
    TableColumn _columnPu=_model.getColumn(_model.getColumnIndex("Amount")); 
    _columnPur.setCellRenderer(_rendererf); 

private void installAllignment(TableColumn tableColumn, final int alignmentCode) { 

    tableColumn.setCellRenderer(new DefaultTableCellRenderer() { 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
                 boolean hasFocus, int row, int column) { 
      Component myself = 
       super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      setHorizontalAlignment(alignmentCode); 

      DefaultTableModel model = (DefaultTableModel) table.getModel(); 
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    DefaultTableCellRenderer() { 
      if (row == table.getRowCount() - 1) { 
       Insets insets = new Insets(1, 0, 0, 0); 

       // setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
      } 

      return myself; 
     } 
    }); 

} 
+1

すぐに役立つようにするには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 –

+0

より良い解決策は、各列に適用されるデリゲートパターンを考案して、一連のデリゲートを呼び出して、プラグイン可能な方法でレンダリング機能を提供することです。 – MadProgrammer

+0

これは実際には難しいようです。デフォルトのAPI以外のものを使用すると、行の色付けを処理するベースレンダラークラスが必要になります。それを他のレンダラーすべての親クラスとして使用します。これは必ずしも可能ではなく、またそれは特にかわいくなり、管理頭痛になります。代わりに、あなたはこのような[この例のような]多くのキャンディストリッピングAPIのうちの1つをユーティリティにすることができます(https://stackoverflow.com/questions/25279727/java-abstracttablemodel-2-different-color-for-each-row/25279954# 25279954) – MadProgrammer

答えて

0

コードはあまり意味がありません。 model,cまたはinsets変数では何もしません。

しかし、レンダラーを変更するのはとても簡単です。 TableColumnをサブクラス化し、getTableCellRendererを上書きします。本体でsuperメソッドを呼び出して、デフォルトのレンダラーコンポーネントを生成し、それを返す前に背景を設定します。

また、TableCellRendererを実装し、サブクラス化ではなくsetTableCellRendererを呼び出すこともできます。

どちらの方法も問題なく動作し、さまざまな状況で役立ちます。

0

すべてが完璧ですが、私は列挙型の列にcurrencyRendererを適用すると、背景色が失われました。

選択背景色やカスタムレンダリングに使用する他の色が失われているかどうかは分かりません。

セルレンダリングの代わりにTable Row Renderingを試してみてください。この方法は、テーブルのprepareRenderer(...)メソッドをオーバーライドしてカスタムカラーリングを行います。

同じブログでTable Format Renderersをチェックしてみることもできます。カスタムレンダラーを簡単に作成する方法を示します。あなたのレンダラのコードは私には意味がありませんところで

Component myself = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
setHorizontalAlignment(alignmentCode); 

DefaultTableModel model = (DefaultTableModel) table.getModel(); 
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

私はあなたが二回getTableCellRendererComponent(...)メソッドを呼び出すことになる理由はわかりません。

関連する問題