2012-01-16 4 views
2

JTable에 대해 사용자 정의 TableCellRenderer (ValueRenderer)이 있고 셀은 Checkbox입니다.itemStateChanged에 대해 TableCellRenderer의 행을 가져옵니다.

example에 언급 된대로 확인란의 상태 변경 (선택/선택 취소)을 수신하기 위해 ItemListener을 valueRenderer에 연결했습니다.

내 문제는 itemStateChanged(ItemEvent e) 안에는 ItemEvent 소스가 ValueRenderer라는 것을 알고이 체크 박스가 포함 된 행을 얻는 방법을 모르겠다.

도와 주시겠습니까?

사용자 정의 TableCellRender : 여기

내 코드의 일부입니다

public class ValueRenderer extends JCheckBox implements TableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { 
     this.setSelected((Boolean) value); 
     return this; 
    } 

} 

된 ItemListener : 당신이 알고 싶은 경우에

public class TableRowCheckBoxListener implements ItemListener { 

    private JTable hqlRequestTable; 

    public TableRowCheckBoxListener(JTable hqlRequestTable) { 
     this.hqlRequestTable = hqlRequestTable; 
    } 

    @Override 
    public void itemStateChanged(ItemEvent e) { 

     /*How do I get the row which contains the checkbox clicked knowing that : 
      e.getSource() == ValueRenderer 
      e.getItem() == ValueRender 
     */ 
    } 

} 
+0

왜 필요합니까? 예제를 다시 읽으면 itemstate 리스닝이 렌더러가 아닌 편집기에서 이루어 지지만 행 열도 없으므로주의해야합니다. JTable은 편집을 중단 할 경우 필요한 행과 열 매핑을 처리합니다. – Peter

+1

렌더러는 완전히 수동적 인 슬레이브이며 paint 메커니즘이 적절하다고 판단 할 때마다 paintComponent를 실제 컴포넌트로 스탬핑하는 것 외에는 아무것도하지 않습니다. 그들에게 어떤 청취자도 등록하지 마라. 그들의 통보는 결코 의미가 없다. – kleopatra

+0

@kleopatra 그것은 Dr.이 아니고 나로 한 것이 아닙니다. [예] (https://sites.google.com/site/drjohnbmatthews/table). 그래서 그의 코드를 가져다가 내 필요에 맞춰 수정하려고 시도했습니다. –

답변

2

때 테이블의 일부 값이 변경, 당신 렌더러에 리스너를 등록하면 안됩니다. 테이블 모델에 리스너를 등록해야합니다. 리스너는 테이블에 표시된 데이터가 저장되는 곳이며 데이터에서 변경된 사항이 있으면 이벤트를 발생시키는 개체입니다.

다른 대안은 빈 목록으로 구성된 사용자 정의 테이블 모델을 사용하고, 테이블 모델에서 보유하는 빈의 특성을 수정하고, 특성 변경시 bean이 특성 변경 이벤트를 시작하도록하는 것입니다. 테이블 모델 리스너를 등록하는 대신 빈에 리스너를 등록합니다 (테이블 모델은 여전히 ​​테이블 모델 이벤트를 발생시켜야 함).

+0

속성 변경 리스너를 어떻게 수행합니까? –

+0

읽기 http://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html –

+0

BTW, 당신은 남자 (자바 남자)입니다. 당신의 대답 덕분에 내가하고있는 어리석은 일을 발견했기 때문에 쓸데없는 일을 몇 시간 만 구해줬습니다. 감사! –

관련 문제