2009-05-27 5 views
0

JTable에는 고유 한 셀 렌더러와 셀 편집기가 있습니다.DefaultCellEditor 파생 인스턴스가 작업을 수행 한 후 셀 렌더러 업데이트

말은, 표 2 열을 포함하고 행 X :
첫번째 열은 부울 값 자체 셀 렌더링 셀 편집기 (라디오 버튼)
번째 열은 문자열 값을 포함하고 그 자신 셀 렌더러 포함을 : 현재 행의 첫 번째 열이 true로 설정된 경우 굵게 표시됩니다 (라디오 버튼 확인 됨)

라디오 버튼이 true로 설정되면 모든 값이 편집기에서 올바르게 업데이트되지만 두 번째 행은 굵게 표시되지 않습니다. ...
다른 행의 라디오 버튼을 확인하여 변경 사항을 확인해야합니다.

어디에서 변경 사항을 적용 할 수 있습니까? 당신의 도움에 대한

건배 및 감사


RadiobuttonTableCellEditor.java는

public class RadiobuttonTableCellEditor extends DefaultCellEditor 
            implements ItemListener { 
JRadioButton rb = new JRadioButton(); 

public RadiobuttonTableCellEditor(JCheckBox pCheckBox) { 
    super(pCheckBox); 
} 

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
    if (value == null) 
     return null; 
    rb.addItemListener(this); 
    rb.setSelected((Boolean)value); 
    return rb; 
} 

public void itemStateChanged(ItemEvent e) { 
    super.fireEditingStopped(); 
} 

public Object getCellEditorValue() { 
    rb.removeItemListener(this); 
    return rb.isSelected(); 
} 
} 

답변

1

값이 바뀔 때마다 테이블 모델에서 적절한 이벤트를 실행해야합니다. 모델이 AbstractTableModel에서 상속 된 경우 몇 가지 fireXXX 방법을 사용할 수 있습니다. 내 생각 엔 setValueAt 메서드에서 호출해야합니다.

정확한 열과 행을 알고있는 경우 fireTableCellUpdated으로 전화를 걸 수 있습니다. 그렇지 않으면 다른 열을 업데이트해야하므로 fireTableChanged을 사용해야 할 수 있습니다.

물론 렌더러는 올바르게 새로운 값을 렌더링해야합니다. 나는 그것이 행의 고유 true 라디오 버튼을, 비슷한 문제를 가진 사람들을 도울 수있는 것 같아요

+0

도움을 주셔서 감사합니다. getTableCellEditorComponent를 호출 할 때 참조하는 JTable의 멤버 선언을 추가했습니다. 그런 다음, 잘 getCellEditorValue이라고합니다 I 상태 :. \t \t 경우 (! 테이블 = NULL) { \t \t \t ((AbstractTableModel가) table.getModel()) fireTableDataChanged(); \t \t} –

+1

아마도 작동하지만 사용자의 접근 방식이 올바르지 않습니다. DATA 변경에 대한 응답으로 테이블 모델에서 fireXXX 메소드를 호출해야합니다.어떤 경우에도 렌더러 또는 편집기에서 수행해야합니다. 아이디어가 간단합니다. 에디터는 model.setValueAt 메소드를 사용하여 새로운 값을 모델에 저장합니다. 그런 다음 모델은 모든 이해 관계자에게 데이터가 변경되었음을 알립니다. 렌더러와 편집자가 자동으로 반응하도록 반응합니다. –

0

거기 DeafultCellEditor을 확장 할 말이하지 않는 것 같습니다. 그런 리스너 인터페이스를 구현하는 것도 좋은 생각이 아닙니다.

렌더러는 가장 얇은 레이어로 가장 잘 작동합니다. 다른 셀을 변경해야하는 경우 관련 업데이트 이벤트를 발생시키는 테이블 모델에이를 반영해야합니다.

+0

그런 일을 올바르게 코딩하는 방법을 알려주십시오. –

0

, 당신은 특히 setValueAt 방법에게 그것의 동작을 수정하기

건배를 DefaultTableModel을 확장해야합니다


/** 
* When <code>column</code> is the column that contains the Boolean (in fact the radio button): 
* If aValue == false and that it had a previous value set to true we don't do anything 
* If aValue == true and that it had a previous value set to false, we set all the other booleans to false and this one to true 
*/ 
@Override 
public void setValueAt(Object aValue, int row, int column) { 
    if (column == colonneBoutonradio) 
    { 
     if (((Boolean)aValue && !(Boolean)super.getValueAt(row, column))) 
      for (int i = 0; i < this.getRowCount(); i++) 
       // i==row permet de vérifier si la ligne courante est celle à modifier (et donc celle à mettre à true) 
       super.setValueAt(i==row, i, colonneBoutonradio); 
    } 
    else 
     super.setValueAt(aValue, row, column); 
} 
관련 문제