2012-03-24 25 views
0

Iは、以下に示すコードを有する:のJava - 特定のセルの背景色を設定

if ("1".equals(tmp.get(h))) { 
    tmp2[0][h] = 1; 
    for (int j = 0; j < truthTable.getModel().getColumnCount(); j++) { 
     renderer = (DefaultTableCellRenderer) truthTable.getCellRenderer(0, 
      j); 
     renderer.setBackground(Color.yellow); 
    } 
} 

getCellRendererメソッドは、パラメータ行と列が含まれており、黄色の背景で、行0を設定することになっているが、代わりにそれをテーブル全体を黄色の背景に設定します。私は混乱しているので、これのための最良の解決策は何ですか?

答えて

2

JTableセルレンダラーはコンポーネントではなく、コンポーネントを使用してJTableで何度も描画するゴムスタンプに似ています。レンダラーの背景を黄色に設定し、目的のセルでない場合はそれを設定解除しないと、すべてのセルを描画すると黄色のままになります。

+0

prepareRendererできること+1 – mKorbel

+0

これにはどのような解決策がありますか?レンダラーをテーブル全体ではなく1つのセルだけに設定する方法はありますか? – Dave

+0

私は居住者のJTableの専門家、@ mKorbelに、気にしなければこれに対処するように頼むつもりです。 –

2

マウスをテーブルに向けます。

package test; 

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JComponent; 
import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class SingleCellColor { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       String[][] data = { 
         {"a", "1","2","3"}, 
         {"b", "3","4","5"}, 
         {"c", "6","7","8"} 
       }; 
       String[] columns = { 
        "Letter", "Num 1", "Num2 ", "Num 3" 
       }; 
       DefaultTableModel tableModel = new DefaultTableModel(data, columns); 

       final SingleCellRenderer renderer = new SingleCellRenderer(); 
       final JTable table = new JTable(tableModel); 
       table.setDefaultRenderer(new Object().getClass(), renderer); 
       table.addMouseMotionListener(new MouseAdapter() { 
        @Override 
        public void mouseMoved(MouseEvent me) { 
         Point p = me.getPoint(); 
         renderer.setColumnHightlight(table.columnAtPoint(p)); 
         renderer.setRowHighlight(table.rowAtPoint(p)); 
         table.repaint(); 
        } 
       }); 
       JScrollPane tableScroll = new JScrollPane(table); 

       JOptionPane.showMessageDialog(null, tableScroll); 
      } 
     }); 
    } 
} 

class SingleCellRenderer extends DefaultTableCellRenderer { 

    private static final long serialVersionUID = 1L; 

    int rowHighlight = -1; 
    int colHighlight = -1; 

    @Override 
    public Component getTableCellRendererComponent(JTable table, 
      Object value, 
      boolean isSelected, 
      boolean hasFocus, 
      int row, 
      int column) { 
     Component c = super.getTableCellRendererComponent(
       table, value, isSelected, hasFocus, row, column); 
     c.setBackground(Color.ORANGE); 
     if (c instanceof JComponent) { 
      boolean isFocused = (colHighlight == column && rowHighlight == row); 
      ((JComponent)c).setOpaque(isFocused); 
     } 
     return c; 
    } 

    public void setColumnHightlight(int colHighlight) { 
     this.colHighlight = colHighlight; 
    } 

    public void setRowHighlight(int rowHighlight) { 
     this.rowHighlight = rowHighlight; 
    } 
} 
+1

これは非常に良い答えです(1+)が、数字レンダラーなどのデフォルト以外のレンダラーを失うという問題が再び発生します。 DefaultTableModelクラスに適切な 'getColumnClass(...)'メソッドのオーバーライドを与えても、すべての数値は左詰めであることに注意してください。 –

+0

@HovercraftFullOfEels多分、私はテーブルの達人が助言するものを見るのを待っていたはずです。 ;)(ちょうどそのコードを実験のためにそこに投げると思った。) –

+1

+1はコンストラクタ内で(... boolean isSelected、boolean hasFocus、int row、int column)ほとんどの場合、(私が大好きです...)prepareRendererまたはgetTableCellRendererComponentがあるかどうかは関係ありません。利点はprepareRendererが行全体をより簡単にハイライト表示できることです(私にとって) – mKorbel

関連する問題