문제

만들기에 관한 좋은 책이나 웹 사이트가 있습니까? JTable?한 열을 편집 가능하게 만들고 싶습니다.실제로 상속된 항목을 넣고 싶습니다. JCheckBox 구성 요소(여기서 생성한)를 테이블에 넣기보다는 테이블 열 중 하나에 추가합니다. JCheckBox 편집 가능하다는 점을 기반으로 boolean 필드.

나는 이것 가지다 JFC 스윙 튜토리얼 제2판 책이지만 테이블을 더 잘 처리하는 방법을 보고 배울 수 있는 다른 예가 있는지 알고 싶습니다.책은 그냥 온라인에서 자바 '트레일'을 가져와서 책에 넣은 것 같습니다.

그래도 내용을 다시 읽고 있는데, 누군가가 더 도움이 될 만한 내용을 찾았는지 궁금합니다.

도움이 되었습니까?

해결책

열을 편집 가능하게 만들려면 isCellEditable 의 방법 TableModel.만들기 TableModel 상속받은 경우 상당히 쉽습니다. AbstractTableModel 그리고 나는 가장 단순한 것을 제외한 모든 것에 그것을 추천하고 싶습니다 JTable에스.

그러나, 적응 TableModel 이는 당신이 해야 할 일의 일부일 뿐입니다.실제로 사용자 정의 구성 요소를 얻으려면 JTable, 사용자 정의 셀 렌더러를 설정해야 합니다.대화형 사용자 정의 구성 요소를 사용하려면 사용자 정의 셀 편집기를 설정해야 합니다.어떤 경우에는 이를 위해 기본 클래스를 약간 수정한 버전을 사용하는 것으로 충분합니다.

편집자

사용자 정의 구성 요소가 이미 있는 경우 위임을 사용하여 쉽게 수행할 수 있습니다.구현하는 새 클래스 만들기 TableCellEditor, 그리고 새로운 구성 요소의 인스턴스 getCellEditorComponent 방법.이 방법의 매개변수에는 현재 값, 셀 좌표, 테이블로 돌아가는 링크, 셀 선택 여부 등이 포함됩니다.

그만큼 TableCellEditor 또한 사용자가 셀 내용에 대한 변경 사항을 커밋하거나(사용자 입력의 유효성을 검사하고 모델을 조정할 수 있음) 편집을 취소할 때 호출되는 메서드도 있습니다.반드시 전화로 문의하세요. stopEditing() 프로그래밍 방식으로 편집을 중단한 경우 편집기에서 메소드를 사용하세요. 그렇지 않으면 편집기 구성 요소가 화면에 그대로 남아 있습니다. 디버깅하는 데 2시간 정도 걸렸습니다.

내에서 JTable 편집자와 오직 편집자는 이벤트를 받습니다!버튼 표시는 렌더러를 사용하여 수행할 수 있습니다.하지만 제대로 작동하는 버튼을 얻으려면 올바른 편집기를 구현해야 합니다. EventListeners 등기.렌더러에 리스너를 등록해도 아무 일도 일어나지 않습니다.

렌더러

귀하의 질문에 설명된 내용에 렌더러를 구현하는 것이 꼭 필요한 것은 아니지만 일반적으로 사소한 수정을 위해서라도 결국 구현하게 됩니다.편집기와 달리 렌더러는 속도가 중요합니다. 그만큼 getTableCellRendererComponent 렌더러는 테이블의 모든 셀에 대해 한 번 호출됩니다! 렌더러에서 반환된 구성 요소는 상호 작용이 아닌 셀을 그리는 데만 사용되므로 다음 셀에 "재사용"될 수 있습니다.즉, 구성요소(예:사용하여 setText(...) 또는 setFont(...) 만약 그것이라면 TextComponent) 렌더러에서는 ~ 아니다 새로운 것을 인스턴스화하십시오. 이는 성능을 저하시키는 쉬운 방법입니다.

주의사항

렌더러와 편집자가 작동하려면 JTable 특정 렌더러/편집기를 사용해야 하는 경우.이를 수행하는 방법에는 기본적으로 두 가지가 있습니다.기본 셀 렌더러/편집기를 설정할 수 있습니다. 특정 유형에 대해 각각을 사용하여 JTable 행동 양식.이 방법으로 작동하려면 TableModel 이 유형을 정확하게 반환해야 합니다. getColumnClass(...) 방법!기본 테이블 모델은 ~ 아니다 당신을 위해 이것을 해주세요, 그것은 항상 돌아옵니다 Object.class.나는 그 사람이 많은 사람들을 당황하게 했다고 확신합니다.

편집기/렌더러를 설정하는 다른 방법은 열 자체에 명시적으로 설정하는 것입니다. TableColumn 를 통해 getTableColumn(...) 의 방법 JTable.이는 훨씬 더 정교하지만 단일 클래스에 대해 두 개의 서로 다른 렌더러/편집기를 갖는 유일한 방법이기도 합니다.예:모델에는 완전히 다른 방식으로 렌더링되는 String 클래스의 두 열이 있을 수 있습니다. JLabel/DefaultRenderer 그리고 다른 하나는 JButton 보다 정교한 편집기에 액세스하려면

JTable 맞춤형 렌더러와 편집기를 사용하면 극도로 다재다능하지만, 받아들이는 것도 많고, 잘못하는 일도 많습니다.행운을 빌어요!

테이블을 사용하는 방법 ~에 스윙 튜토리얼 JTables를 사용자 정의하는 모든 사람은 반드시 읽어야 합니다.특히 읽고 또 읽으세요. 개념:편집자 및 렌더러 일반적으로 "클릭"하는 데 시간이 걸리기 때문입니다.사용자 정의 렌더러 및 편집기에 대한 예제도 매우 가치가 있습니다.

다른 팁

자신만의 동작을 생성하기 위해 확장하려는 클래스는 DefaultTableModel입니다.이를 통해 자신의 행동을 정의할 수 있습니다.괜찮은 튜토리얼을 찾을 수 있습니다 썬 사이트에서.

이 튜토리얼은 자바 로비 따라하기 쉽습니다.온라인 JTable의 스윙 트레일 귀하가 참조하는 내용은 업데이트되었음을 ​​나타냅니다.가능한 더 나은(새로운 것이 항상 더 나은 것은 아니지만) 정보를 찾기 위해 전체 내용을 스캔했습니까?

간단하게 사용하려고 한다면 JTable 1개의 열을 편집할 수 있고 열 위치를 알고 있으면 언제든지 기본 테이블 모델을 사용하여 오버로드할 수 있습니다. isCellEditable 부르다.

이 같은 :

myTable.setModel(new DefaultTableModel(){
@Override
public boolean isCellEditable(int row, int column) {
    if (column == x) {
        return true;
    } else
        return false;
}
});

그리고 확인란에 대해 렌더러 클래스를 만듭니다.

MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer

유용한 클래스는 다음과 같습니다:

Package javax.swing.table :

TableModel - 인터페이스 tablemodel AbstractTableModel - 사용자 정의 데이터 구조를 사용하여 자신만의 테이블을 생성하기 위해 확장할 수 있는 멋진 클래스DefaultTableModel - 처리할 수 있는 기본 테이블 모델 arrays[] 그리고 Vectors

셀 편집을 비활성화하려면 isCellEditable(int row, int col) 방법

테이블 모델에서는 아래와 같이 "isCellEditable" 및 "setValueAt" 함수를 재정의해야 합니다.
4열은 편집 가능한 셀의 열입니다.
그런 다음 셀을 두 번 클릭하고 무언가를 입력하면
setValueAt()가 호출되어 tableModel의 DO, 필드 col4에 값을 저장합니다.

public ArrayList<XXXDO> tbmData = new ArrayList<XXXDO>(); //arraylist for data in table

@Override
public boolean isCellEditable(int row, int col) {
    if (col == 4) {
        return true;
    } else {
        return false;
    }
}

@Override
public void setValueAt(Object value, int row, int col) {
    if ((row >= 0) && (row < this.tbmData.size()) && (col >= 0) && (col < this.colNm.length)) {
        if (col == 4) {
            tbmData.get(row).col4= (String) value;
        }
        fireTableCellUpdated(row, col);
    } else {
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top