2014-10-22 7 views
1

부울 값 열이있는 JTable이 있습니다. 모델에 저장된 상태에 따라 일부 또는 모두를 편집 할 수 없게 만듭니다 (모델의 isCellEditable()은 false를 반환합니다). 그러나 이것은 편집 가능 셀에 대해 비활성화로 체크 박스를 렌더링하는 부울 렌더러를 만들지 않습니다.JTable 비활성화 됨 확인란을 사용하여 편집 할 수없는 셀을 찾습니다.

사용자 정의 부울 렌더러를 작성하는 것 이외에 다른 방법을 사용하는 방법이 있습니까?

내 렌더러를 작성해야한다면 JCheckbox 이외의 클래스를 확장해야합니까? 난 그저 렌더링하기 전에 확인란을 비활성화하고 모든 렌더링 코드를 구현하고 선택한 모양과 물건을 처리하지 않으려 고합니다.

+2

더 나은 도움을 [MCVE] (http://stackoverflow.com/help/mcve) (검증 가능한 최소 예). –

+0

은 로컬 변수의 JTable/XxxTableModel에 대한 하드 코딩 된 값을 사용하여 SSCCE/MCVE, short, runnable, compilable – mKorbel

답변

0

실례가 없으면 무엇이 잘못되었는지를 말하기는 어렵지만 JTable에게 자체를 다시 칠할 필요가 있음을 알리기 위해 테이블 ​​수정 이벤트를 실행하는 것을 잊어 버린 것처럼 들릴 수 있습니다.

fireTableChanged(new TableModelEvent(sourceModel, firstRow, lastRow, tableCol)); 

당신이 TableModelEvent는 생성자에 전달할 수 있습니다 당신은 해고 할 수있는 다른 테이블 변경 이벤트 및 다른 매개 변수가 있습니다 : 당신이 당신의 변경을 할 때 당신은 당신의 모델이 같은 뭔가가 필요합니다. 자세한 내용은 Javadocs (http://docs.oracle.com/javase/8/docs/api) 및 Java 자습서 (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#fire)를 참조하십시오. 특정 상황에 적합한 것이 무엇인지 알아 내기 위해 이것들을 읽어야합니다.

사용자 정의 부울 렌더러가 필요할 것입니다.

2

그러나 이것은 JTable 부울 렌더러로 하여금 편집 가능하지 않은 셀에 대해 비활성화 된 체크 박스로 렌더링하지는 않습니다.

는 기본 렌더러의 행동 때문에 이것은 올바른 : JCheckBox은 편집 할하지만 사용할 수 없습니다 .

사용자 정의 부울 렌더러를 작성하는 것 외에 다른 방법을 사용하는 방법이 있습니까?

아니요, 알고있는 한.

내 렌더러를 작성해야한다면 JCheckbox 이외의 다른 클래스를 확장해야합니까?

TableCellRenderer 인터페이스를 구현하는 모든 클래스를 확장하는 필수 아니에요. 렌더러의 클래스 멤버로 완벽하게 JCheckBox을 가질 수 있습니다. 사실, 상속보다 구성이 더 좋습니다.

렌더링하기 전에 확인란을 비활성화하면 모든 렌더링 코드를 구현하고 선택한 모양과 항목을 처리하지 않아도됩니다.

너무 어렵지 않고 어떤 일이 일어나고 있는지 제어 할 수 있습니다.관련 문제에 대한이 Q & A를 참조

class CheckBoxCellRenderer implements TableCellRenderer { 

    private final JCheckBox renderer; 

    public CheckBoxCellRenderer() { 
     renderer = new JCheckBox(); 
     renderer.setHorizontalAlignment(SwingConstants.CENTER); 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Color bg = isSelected ? table.getSelectionBackground() : table.getBackground(); 
     renderer.setBackground(bg); 
     renderer.setEnabled(table.isCellEditable(row, column)); 
     renderer.setSelected(value != null && (Boolean)value); 
     return renderer; 
    } 
} 

: 아래의 예를 생각해 빨리 게시 JXTable: use a TableCellEditor and TableCellRenderer for a specific cell instead of the whole column