2009-07-13 10 views
14

JTable에서 일부 행을 제거하려고합니다. 내가 어떻게 해?JTable에서 행을 제거하는 방법은 무엇입니까?

+6

팁입니다 : 당신은 당신이 이미 시도 것을 설명하고, 당신이 읽은 온라인 자습서, 사람들이 당신을 도울 의향이 될 것입니다 무엇을합니다. 또는 샘플 코드를 제공하고 작동하지 않는 비트를 알려주십시오. 아직 읽지 않은 경우이 내용을 읽으십시오. http://java.sun.com/docs/books/tutorial/uiswing/components/table.html –

답변

3

JTable은 일반적으로 MVC 구현의보기 부분을 형성합니다. 모델에서 행을 제거하려고합니다. 이러한 변경을 대기하고있는 JTable가이 삭제를 반영하도록 (듯이) 갱신됩니다. 따라서 JTable의 메소드로 removeRow() 또는 유사한 메소드를 찾을 수 없습니다. 당신이 사용할 수있는 간단한 모델의 DefaultTableModel를에서

+0

고맙습니다. 도움을 받으려면 고맙지 만 행을 삭제하는 방법을 알고 싶습니다. 테이블 모델, 메신저 방법을 얻지 못했습니다. –

+1

다음과 같은 내용을 읽으십시오. http://java.sun.com/docs/books/tutorial/uiswing/components/table.html – dave

+0

요약하면 사용자 정의 TableModel을 작성합니다. JTable는 행을 저장하지 않고 TableModel에 위임합니다. 원하는 경우 AbstractTableModel에서 서브 클래스화할 수 있습니다. 행을 삭제할 때마다 fireTableRowsDeleted()를 호출하십시오. – dave

33

, 당신은 제거해야합니다 : 테이블 모델로 JTable의 사용에 대한 자세한 내용은 기본 일 튜토리얼에서

http://java.sun.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html

봐 타겟 행을 기초로 한 것 TableModel. 예를 들어, 귀하의 TableModel이 DefaultTableModel의 인스턴스의 경우, 다음을 수행하여 행을 제거 할 수 있습니다

((DefaultTableModel)myJTable.getModel()).removeRow(rowToRemove); 
+0

고맙습니다.하지만이 방법을 사용했지만 작동하지 않습니다. 사실 내 JTable은 (내가 만든) LocationTable 모델 extendind 추상 테이블 모델을 사용하고 있으므로 내가 removeRow (i) 메서드를 사용할 때 "cant resolve removeRow()"오류가 발생합니다. 대체 방법을 사용해야합니다. –

+4

글쎄, 자신 만의 커스텀 TableModel을 작성하면, 독자적인 "removeRow"메소드를 작성할 책임이 있습니다. 이것이 어떻게 수행되는지 보려면 DefaultTableModel의 소스 코드를보십시오. 쉬운 해결책은 DefaultTableModel을 사용하는 것입니다. 왜 사용자 정의 TableModel을 만들어야한다고 생각합니까? 모델 사용의 기본 사항을 이해할 때까지 제공된 기본값을 사용하십시오. – camickr

4

JTable의에 필터를 적용하는 올바른 방법은 TableRowSorter를 추가 한 RowFilter 인터페이스를 통해입니다. 이 인터페이스를 사용하면 기본 모델을 변경하지 않고도 모델보기를 변경할 수 있습니다. 이 전략은 Model-View-Controller 패러다임을 보존하는 반면, 모델 자체에서 숨길 행을 제거하면 우려 사항을 혼동하여 패러다임을 깨뜨릴 수 있습니다.

8

간단한 해결책이 필요하면 DefaultTableModel을 사용해보십시오.

테이블 모델을 직접 작성한 경우 AbstractTableModel을 확장 한 경우 removeRow() 메소드도 구현해야합니다. 정확한 구현은 데이터를 저장하는 데 사용 된 기본 구조에 따라 다릅니다.

public class SimpleTableModel extends AbstractTableModel { 
    private Vector<String> columnNames = new Vector<String>(); 
    // Each value in the vector is a row; String[] - row data; 
    private Vector<String[]> data = new Vector<String[]>(); 

    ... 

    public String getValueAt(int row, int col) { 
     return data.get(row)[col]; 
    } 

    ... 

    public void removeRow(int row) { 
     data.removeElementAt(row); 
    } 
} 

사용한 경우 목록, 그것은 매우 비슷하게 될 것이다 :

// Each item in the list is a row; String[] - row data; 
List<String[]> arr = new ArrayList<String[]>(); 

public void removeRow(int row) { 
    data.remove(row); 
} 

의 HashMap 당신이 벡터를 사용한 경우, 다음 이런 식으로 뭔가 할 수있다 예를 들어

, :

//Integer - row number; String[] - row data; 
HashMap<Integer, String[]> data = new HashMap<Integer, String[]>(); 

public void removeRow(Integer row) { 
    data.remove(row); 
} 

그리고 당신이 하나

,536 같은 배열을 사용하는 경우
String[][] data = { { "a", "b" }, { "c", "d" } }; 

배열에서 요소를 동적으로 제거 할 방법이 없기 때문에 운이 좋지는 않습니다. 어떤 행이 삭제되고 어떤 것이 아닌지를 알려주는 플래그를 개별적으로 저장하여 배열을 사용하려고 시도 할 수 있습니다.하지만 반대하는 것이 좋습니다 ... 불필요한 복잡성을 초래할 수 있으며 실제로는 이됩니다. 또 다른을 생성하여 문제를 해결하십시오. 결국 here으로 끝나는 확실한 방법입니다. 위의 방법 중 하나를 사용하여 대신 테이블 데이터를 저장하십시오.더 나은이 작동하는 방법의 이해, 무엇을 적절하게 자신의 모델 일을하게 할 들어

, 난 당신이 Java Tutorial, DefaultTableModel API을 참조 조언을 강하게그것은 source code을합니다.

3

음은 매우 간단 사람

for(int i = model.getRowCount() - 1; i >= 0; i--) 
{ 
    model.removeRow(i); 
} 
+1

아침에 백만 건의 알림을받지 못합니다. ;-) – greenoldman

관련 문제