2010-08-13 8 views
2

AbstractTableModel에서 테이블을 삭제했습니다. 테이블의 데이터는 Vector에 저장됩니다. 이제 행을 제거하면 벡터에서 성공적으로 제거되지만 GUI의 뷰에서 업데이트되지 않습니다. 이 removeAl 나를 위해 액세스 할 수 없습니다,Java Swing - AbstractTableModel()을 사용하여 테이블에서 행을 삭제합니다.

dataModel = new AbstractTableModel() { 
      public void removeAl() { 
        fireTableRowsDeleted(0, getRowCount()-1); 
      } 
}; 

을하지만 :

은 내가 fireTableRowsDeleted()를 사용할 필요가 다른 곳에서 읽고, 내가 AbstractTableModel에 래퍼 메서드 내 호출하려합니다. 나는 이것을 어디에서든지 이렇게 부를 수는 없다 : dataModel.removeAl()

무엇이 잘못되었는지 이해할 수 있도록 도와 주시겠습니까? 행을 삭제할 때 GUI를 어떻게 업데이트합니까?

편집 : 문제는 다른 곳에서 발생했습니다. 일단 그것을 고치면 Vector 자체에서 행을 제거하면 GUI가 업데이트되기 시작합니다. :)

+0

나는 대답 하겠지만, 몇 가지 대답을 먼저 받아 들여야합니다. –

+0

@Romain stackoverflow.com의 목적은 평판 점수를 축적하는 것이 아니라 공유 지식입니다. –

+0

주의를 기울이지 않아서 죄송합니다. 나는 이제 내 모든 질문에 대한 대답을 받아 들였다. 나 한테 다시 생각해 볼 수 있겠 니? – Chaitanya

답변

1

익명 클래스에서 선언 되었기 때문에 removeAll 메서드가 표시되지 않습니다. 익명 클래스는 이름으로 참조 할 수 없으므로 익명 클래스는이 클래스의 새로운 선언에 액세스 할 수 없습니다. 이러한 이유 때문에 익명 클래스의 public 선언은 일반적으로 재정의됩니다. 익명이 아닌 기본 클래스를 사용하여 사용할 수 있기 때문입니다.

는이 문제를 해결 한 후 removeAll() 방법에 액세스 할 수 MyTableModel으로 캐스팅해야합니다 AbstractTableModel

public class MyTableModel extends AbstractTableModel { 

    public void removeAll() { 
     fireTableRowsDeleted(...); 
    } 
} 

클라이언트 코드의 정규 서브 클래스로 테이블 모델을 선언합니다.

간단하지만 빈약 한 해결책은 클라이언트가 AbstractTableModel을 계속 사용하고 클라이언트가 명시 적으로 fireTableRowsDeleted()을 호출하도록하는 것입니다.

: MDMA, 당신은 또한이 메소드를 오버라이드 (override) 않습니다하지 않는 한 따라서 당신이 어떤 AbstractTableModel 서브 클래스를 인스턴스화 할 수 없습니다, (그들은 AbstractTableModel에 의해 구현되지 않은 남아 있습니다) TableModel 인터페이스에서 다음 메소드를 오버라이드 (override) 할 필요가 말뿐만 아니라
+0

답장을 보내 주셔서 감사합니다. 나는 이것을 시도하고 그것이 어떻게되는지 알려줄 것이다. – Chaitanya

3

public int getRowCount(); 
public int getColumnCount(); 
public Object getValueAt(int row, int column); 

마지막으로 removeAll() 메서드에서 tableRowsDeleted를 실행하는 것만으로는 충분하지 않을 수 있습니다. 이전 메서드가 반환하는 값에 영향을 주어야합니다. 즉 removeAll()이 호출 된 후에 getRowCount()이 0을 반환하는지 확인해야합니다. 그렇지 않으면 문제가 발생합니다 (최악의 경우 NullPointerException 또는 이와 동등한 경우, 가장 좋은 경우 JTable 새로 고침 문제)!

아마도 첫 번째 단계에서 DefaultTableModel을 사용하는 것이 더 편리 할 수도 있습니다. AbstractTableModel에서 파생되는 것은 나중에 나옵니다. 그것은 당신이 실제로하고 싶어하는 것에 달려 있습니다 ...