2016-07-25 13 views
1

jtableの特定のセルを色付けしたいと思います。ここに私のレンダークラスがあります。 sysoutをifブロックに置く。すべての文字列が印刷されますが、セルの色はそれらの1つを除いて変更されませんでした。セルの値に応じてjtableのセルを色付けする方法

public class MyRenderer extends DefaultTableCellRenderer { 
    static double rpmMin, rpmMax, speedMin, speedMax, temperatureMin, temperatureMax, voltageMin, voltageMax; 


    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); 
    if (!table.isRowSelected(row)) { 
     if (column == 2 && Double.parseDouble(value.toString()) > rpmMin 
       && Double.parseDouble(value.toString()) < rpmMax) { 
      c.setBackground(Color.PINK); 
     } 
     if(column == 3 && Double.parseDouble(value.toString()) > speedMin 
       && Double.parseDouble(value.toString()) < speedMax){ 
      c.setBackground(Color.PINK); 
     } 
     if (column == 4 && Double.parseDouble(value.toString()) > temperatureMin 
       && Double.parseDouble(value.toString()) < temperatureMax) { 
      c.setBackground(Color.PINK); 
     } 
     if(column == 5 && Double.parseDouble(value.toString()) > voltageMin 
       && Double.parseDouble(value.toString()) < voltageMax){ 
      c.setBackground(Color.PINK); 
     } 
     else { 
      c.setBackground(Color.GREEN); 
     } 
    } 

    return c; 
    } 
} 

Here is the output of my program. Only the first unsuitable value is colored pink.

私は適切な出力を表示するために、Excelを準備。 Here is the picture that I expected to see as output of this program

なぜ動作しないのか分かりません。誰かが私にそれを説明できますか?ありがとうたくさん:)

+0

1)すぐに役立つようにするには、[MCVE]または[Short、Self Contained、Correct Example](http://www.sscce.org/)を投稿してください。 2)「コードブロックの括弧の検出/修正」(http://meta.stackexchange.com/q/251795/155831)を参照して、修正できなくなった問題を解決してください。 –

答えて

3

ロジックトラップ。あなたの個人的なifは正常に動作している、それはちょうどあなたの最後のifそれが適切にピンクでなければ、すべての緑になるif/elseステートメントです。

したがって、基本的に最初の4つのif文は無視されます。最後のものだけが緑かピンクかを判断するので、が無視されます。

また、正常性のために、1回解析し、2回以上再利用します。

Double val = Double.parseDouble(value.toString()); 

    if (column == 2 && val > rpmMin 
      && val < rpmMax) { 
     c.setBackground(Color.PINK); 
    } 
    else if(column == 3 && val > speedMin 
      && val < speedMax){ 
     c.setBackground(Color.PINK); 
    } 
    else if (column == 4 && val > temperatureMin 
      && val < temperatureMax) { 
     c.setBackground(Color.PINK); 
    } 
    else if(column == 5 && val > voltageMin 
      && val < voltageMax){ 
     c.setBackground(Color.PINK); 
    } 
    else { 
     c.setBackground(Color.GREEN); 
    } 
+0

私は典型的には 'switch'文が好きではありませんが、私はここで使うと思います。 – bradimus

+0

@bradimus私はそれについては考えていませんでしたが、ええ、 'column'の' switch'はうまくいくでしょう。 – Compass

+0

ありがとうございます。私は2時間かけて間違ったことを考えていました。私はちょうどif文を実現しました。私はなぜ私がこのようにそれらを使用したのか正確にはわかりません。 Thanks again @Compass –

1

かのようなもの(これをコンパイルしていない、粗さを言い訳してください):に列の値に適切なチェックを

int [][] minMaxes = { {0, 0}, 
         {0, 0}, 
         {rpmMin, rpmMax}, 
         {speedMin, speedMax}, 
         {temperatureMin, temperatureMax}, 
         {voltageMin, voltageMax} 
        }; 
Color bgColor; 
if (val > minMaxes[column][0] && val < minMaxes[column][1]) 
{ 
    bgColor = PINK; 
} 
else 
{ 
    bgColor = GREEN; 
} 
c.setBackGround(bgColor); 

など

EDIT

日付と時間の文字列のエラーの原因を防ぐために、ブロックにコードを追加してもう1つ追加して、それは完全に機能しました。ここにはgetTableCellRendererComponentメソッドがあります。

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); 
    double [][] minMaxes = { {0, 0}, 
      {0, 0}, 
      {rpmMin, rpmMax}, 
      {speedMin, speedMax}, 
      {temperatureMin, temperatureMax}, 
      {voltageMin, voltageMax} 
      }; 
    if (!table.isRowSelected(row)) { 
     if(column == 0 || column == 1){ 
      c.setBackground(Color.WHITE); 
     } 
     else if (Double.parseDouble(value.toString())>minMaxes[column][0] && Double.parseDouble(value.toString())<minMaxes[column][1]) { 
      c.setBackground(Color.PINK); 
     } 
     else { 
      c.setBackground(Color.GREEN); 
     } 
    } 

    return c; 
} 
関連する問題