2013-03-26 3 views
-1

참고 :이 코드는 제 것이 아니며 다른 사이트에서 가져 와서 수정하려고합니다.셀 렌더러를 사용자 정의하여 하나의 셀 색상을 변경 하시겠습니까?

세부 정보로드가있는 JTable이 있지만 첫 번째 셀의 색을 변경하기 위해 특정 셀을 변경할 때 유용합니다. 현재이 코드는 클릭 할 때 행을 강조 표시하지만 값을 다른 숫자로 변경하면 이름 셀이 빨간색으로 변경됩니다. 나는 몇 가지 (if 문)을 시도했지만 그것을 작동하지 않을 수 있습니다. 어떤 도움이라도 좋을 것입니다. 당신이 행 번호를 알고있는 경우

import javax.swing.*; 
import javax.swing.table.*; 
import java.awt.*; 

public class CustomCellRenderer{ 
    JTable table; 
    TableColumn tcol; 
    public static void main(String[] args) { 
    new CustomCellRenderer(); 
    } 

    public CustomCellRenderer(){ 
    JFrame frame = new JFrame("Creating a Custom Cell Reanderer!"); 
    JPanel panel = new JPanel(); 
    String data[][] = {{"Vinod","Computer","3"}, 
    {"Rahul","History","2"}, 
    {"Manoj","Biology","4"}, 
    {"Sanjay","PSD","5"}}; 
    String col [] = {"Name","Course","Year"}; 
    DefaultTableModel model = new DefaultTableModel(data,col); 
    table = new JTable(model); 
    tcol = table.getColumnModel().getColumn(0); 
    tcol.setCellRenderer(new CustomTableCellRenderer()); 
    tcol = table.getColumnModel().getColumn(1); 
    tcol.setCellRenderer(new CustomTableCellRenderer()); 
    tcol = table.getColumnModel().getColumn(2); 
    tcol.setCellRenderer(new CustomTableCellRenderer()); 
    JTableHeader header = table.getTableHeader(); 
    header.setBackground(Color.yellow); 
    JScrollPane pane = new JScrollPane(table); 
    panel.add(pane); 
    frame.add(panel); 
    frame.setSize(500,150); 
    frame.setUndecorated(true); 
    frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    } 

    public class CustomTableCellRenderer extends DefaultTableCellRenderer{ 
    public Component getTableCellRendererComponent (JTable table, 
Object obj, boolean isSelected, boolean hasFocus, int row, int column) { 
    Component cell = super.getTableCellRendererComponent(
    table, obj, isSelected, hasFocus, row, column); 
    if (isSelected) { 
    cell.setBackground(Color.green); 
    } 
    else { 
    if (row % 2 == 0) { 
    cell.setBackground(Color.lightGray); 
    } 
    else { 
    cell.setBackground(Color.lightGray); 
    } 
    } 
    return cell; 
    } 
    } 
} 
+0

코드에 달성하려는 부분이 포함되어 있지 않은 것 같습니다. 렌더러는 스트라이핑 외에 아무것도하지 않고 먼저 비주얼을 결정해야하는 값에 따라 색상을 구현 한 다음 다시 칠할 필요가있는 셀을 다시 그려야합니다. – kleopatra

답변

1

당신이 당신의 테이블 모델 AbstractTableModel가 연장을 가정하고 getTableCellRendererComponent 방법

if (row==theRowNumberToHighlight && column=0) { 
    cell.setForeground(Color.red); 
} 
+0

"동적으로"셀을 강조하고 싶습니다. 따라서 특정 셀에서 값이 변경되면 특정 셀의 색상이 변경됩니다. –

+0

값이 변경된 곳과 변경된 값의 행/열은 무엇인지 알아야합니다. – StanislavL

1

의 마지막에 추가 강조하고 싶은, TableModelListener을 확장합니다. 당신의 렌더러를 호출 할 때 알아 내기 위해 다음과 같은 또, tableChanged 방법을 사용 :

public void tableChanged(TableModelEvent e) 
{ 
    if (e.getColumn() == columnYouAreChecking && e.getFirstRow() == rowYouAreChecking && e.getLastRow() == rowYouAreChecking) 
    { 
     // Change cell color here. 
    } 
} 

이 코드는 테이블의 변화 때마다 데이터를 호출되는 것입니다.

+0

아니요, 렌더러가 있어야합니다. 완전히 패시브, 셀 때 스탬프를 요청했을 때만 깨어 난. – kleopatra

+0

감사합니다 kleopatra. 리스너 자체에 리스너를 두는 것에 대한 언급을 꺼 냈습니다. –

+0

좋습니다, 감사합니다 .-) – kleopatra

관련 문제