2016-01-11 17 views
5

私はこの問題の解決策を探しています: 私はデータを含むExcelファイルを持っています。いくつかの細胞は黄色の背景を持っています。私はすでにJTableにテキストをインポートするためのコードを作成しました。これはうまく動作します。しかし、私は背景細胞の色を特定の細胞にもインポートしたいと思っています。この例を簡単にするために、私はループを使用せず、ソースなどからExcelデータを読み込んでいませんでした。私が理解したフォーラムを読んだ後、私はCustomCellRendererが必要です。JTable内の特定のセルのみを色付けします

このコードでは、最初に列のセルの色が正しく表示されますが、この表の色付きセルをスクロールし始めると、列全体が黄色に再現されるため、この方法に問題があります。

私は残りのセルを特に白に色付けするためにelse文を追加できると思っていましたが、私の以前のセル結果を上書きしてしまうため、このアプローチはうまくいきません。

私はこの問題の解決策を教えていただけますか? (これはバグかJTableの予想される動作ですか?)私はあなたのセルが黄色であってはならないときよう

enter image description here

import java.awt.Color; 
import java.awt.Component; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 

public class MyRenderer extends DefaultTableCellRenderer { 

    @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); 

     int[][] coordinatesYellow = new int[3][2]; 
     //[row][column] these cells are yellow 
     coordinatesYellow[0][0] = 3; 
     coordinatesYellow[0][1] = 2; 
     coordinatesYellow[1][0] = 4; 
     coordinatesYellow[1][1] = 2; 
     coordinatesYellow[2][0] = 2; 
     coordinatesYellow[2][1] = 2; 

     for (int i = 0; i < 3; i++) { 
      if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) { 
       c.setBackground(Color.yellow); 
      } 
     } 
     return c; 
    } 
} 



// And this is the statement I use for calling the renderer: 
// resultsTable.getColumnModel().getColumn(0).setCellRenderer(new MyRenderer()); 
+0

@TT - あなたのコメントは基本的に完全な答えです。 – tucuxi

+0

@tucuxi本当に、それは私がコメントとして投稿したように些細な音だ。私はそれに答えました。 –

+0

http://stackoverflow.com/questions/22606227/colored-table-cellsも参照してください(重複している場合もあります) – Marco13

答えて

2

はあなたが白に背景を設定(またはテーブルの背景色)は、それを作るNetBeansとGUIのドラッグ&n個の液滴発生器を使用しています。

DefaultTableCellRendererを拡張するレンダラは、すべてのセルのテンプレートとして同じコンポーネント(JLabel)を使用します(DefaultTableCellRendererの実装ノートを参照)。これはラバースタンプと呼ばれます。背景を黄色に設定すると、背景色を変更するまで連続したセルを描画すると黄色のままになります。

次のようなものでループのためにあなたを交換してください:

boolean isYellow = false; 
for (int i = 0; i < 3; i++) { 
      if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) { 
       c.setBackground(Color.yellow); 
       isYellow = true; 
      } 
     } 
if(!isYellow) 
    c.setBackground(Color.white); 
+0

これは意図した通りに動作しません。 else文をforループに追加すると、forループが結果を上書きするため、結果はsampletextセルだけが黄色になります。 – radox1912

+1

@ radox1912 **すべての**色を黄色に設定しない場合...つまり、黄色に色を設定していない場合は、白に設定する必要があります。 –

+0

@ radox1912私は文を反映したコードセグメントを追加しました。 –

関連する問題