2016-07-25 2 views
1

jtable의 특정 셀을 색칠하고 싶습니다. 여기 내 렌더링 클래스입니다. 나는 sysout을 if 블럭에 집어 넣었다. 모든 문자열이 인쇄되지만 셀 색상은 그 중 하나를 제외하고 변경되지 않았습니다. 셀의 값에 따라 jtable의 셀을 색칠하는 방법

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

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; 
    } 
} 

I는 적절한 출력을 표시 할 엑셀을 준비했다. Here is the picture that I expected to see as output of this program

왜 작동하지 않았는지 알 수 없습니다. 누군가 제게 설명해 주시겠습니까? 고마워요 :)

+0

1) 더 나은 도움을 받으려면 [MCVE] 또는 [짧은, 자체 포함, 올바른 예] (http://www.sscce.org/)를 게시하십시오. 2) 더 이상 고칠 수없는 문제에 대해서는 [코드 블록의 걸쇠 대괄호 탐지/수정] (http://meta.stackexchange.com/q/251795/155831)을 참조하십시오. –

답변

3

로직 트랩. 당신의 개인적인 if는 잘 작동하고 있습니다, 그것은 마지막으로 if/else 문이 적당히 분홍색이 아닌 한 모든 것을 녹색으로 바꿀 것입니다.

기본적으로 첫 번째 4 if 문은 무시됩니다.은 녹색인지 핑크인지를 결정합니다.

또한 정상적인 목적으로 한 번 구문 분석하고 두 번 이상 다시 사용하십시오.

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

정말 고마워요. 나는 두 시간 동안 내가 잘못한 것을 생각하고 있었다. 방금 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); 

편집

로를 날짜 및 시간 문자열의 오류를 방지하려면 코드에 블록을 하나 더 추가하면 완벽하게 작동합니다. 다음은 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; 
} 
관련 문제