2016-08-25 4 views
0

Java 응용 프로그램에서 색을 선택하고 해당 동작을 선택하려고합니다. 이를 위해 TableCellRenderer의 사용자 정의 구현을 작성했으며 원하는대로 작동합니다. 여기사용자 정의 TableCellRenderer가있는 Swing JTable

public class AccountMovementTableCellRenderer extends JLabel implements TableCellRenderer{ 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){  
     //My implementation here... 
     return this; 
    } 
} 

그리고 JTable의 창조 :

AccountMovementTableCellRenderer accountMovementCellRenderer = new AccountMovementTableCellRenderer(); 
entryTable = new JTable(entryModel){ 
    private static final long serialVersionUID = 1L; 

    @Override 
    public TableCellRenderer getCellRenderer(int row, int column){ 
     return accountMovementCellRenderer; 
    } 
}; 

난 단지 만들 그러나 여기

이 (가) TableCellRenderer의 구현입니다 ... 난 아직도 대해 혼란 스러워요 뭔가가있다 내 CellRenderer의 한 인스턴스이지만 셀당 하나의 CellRenderer을 기대하고 있었고이 방법으로 작동하는 것에 놀라움을 금치 못했습니다 ... 내용과 색상은 모든 셀마다 다르지만 항상 CellRenderer의 동일한 인스턴스를 사용하므로 어떻게 작동 할 수 있습니까? ?

답변

3

TableCellRenderer.prepareRenderer 반환이 JTable의 내용을 렌더링하는 데 재사용되는 구성 요소 -이 JLabel의이 JTable의 내용을 그리는 데 사용됩니다 - 귀하의 경우 귀하의 렌더러는 JLabel은 (방금 DefaultTableCellRenderer를 유지할 수 있었을 수 있습니다) 확장합니다. prepareRenderer 메서드는 렌더링 전에 각 셀의 JLabel을 사용자 지정하는 데 사용됩니다. 인용 할 Oracle's tutorial on the JTables

테이블의 각 셀은 구성 요소 일 것으로 예상 할 수 있습니다. 그러나 성능상의 이유로 스윙 테이블은 다르게 구현됩니다.

대신 단일 셀 렌더러를 사용하여 동일한 유형의 데이터를 포함하는 모든 셀을 그립니다. 렌더러는 테이블에서 각 셀에 형식이 지정된 데이터를 적절하게 스탬프 처리하는 구성 가능한 잉크 스탬프로 생각할 수 있습니다. 사용자가 셀의 데이터 편집을 시작하면 셀 편집기가 셀을 인계 받아 셀의 편집 동작을 제어합니다.

2

단일 렌더러 인스턴스는 위의 코드를 기반으로 각 셀의 상태를 반영하는 각 셀에 대해 고유 한 이미지을 만듭니다.