프레임에 JFrame
및 JTable
이라는 간단한 문자가 있습니다. 사용자는 테이블의 행에 데이터를 제공 할 수 있습니다. 요구 사항 중 하나는 프레임을 닫은 후 새 데이터를 저장하거나 삭제할 수 있다는 것입니다. 프레임의DefaultTableModel의 dataVector 복제 문제
오버라이드
setVisible()
방법과DefaultTableModel
의 데이터 벡터를 복제 :이 동작을 수행하는 가장 쉬운 방법은 다음과 같은 것을 생각했다.프레임에
WindowListener
을 추가하고WindowClosing
이벤트에 대해 반응합니다. 이렇게하면 창 수신기는 모델을 이전에 저장 한 모델로 다시 설정해야하는지 여부를 결정할 수 있습니다.@Override public void setVisible(boolean b) { //save the original models only if setVisible invoked with true (do not save the model when hiding the frame) if (b) { Vector cloned = (Vector) userTableModel.getDataVector().clone(); Vector headerNames = new Vector(); originalModel = new CustomTableModel(cloned, headerNames); } super.setVisible(b); }
는 사실, 뭔가 이상한 일이 일어나고 :
여기에 관련 코드입니다. I는 데이터 벡터를 복제 한 후, 테이블은 렌더링이 다음 예외로 연결되지 않을 수
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 at java.util.Vector.elementAt(Vector.java:470) at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:650) at asc.model.CustomTableModel.getValueAt(CustomTableModel.java:74) at javax.swing.JTable.getValueAt(JTable.java:2720)
테이블은 어떤 방식으로 관련 originalModel
아니다. 이론 상으로는 복제가 테이블의 모델에 영향을주지 않아야하기 때문에 놀랍습니다. originalModel의 의도는 새로 생성 된 테이블 모델의 복사본에 대한 참조를 유지하는 것입니다. originalModel
의 생성을 주석 처리하고 나면 모든 것이 잘 동작합니다. 나는 headerNames
벡터에 빈 String
을 추가 할 때 또 다른 흥미로운 점은
, 테이블 렌더러는 거의 같은 ArrayIndexOutOfBounds
예외가 발생하지만,이 엔딩 :이 경우
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
,의 첫 번째 열 첫 번째 행은 완벽하게 렌더링됩니다.
내 CustomTableModel
은 DefaultTableModel
에서 확장되었으며 특별한 방법은 사용하지 않습니다. 생성자는 단순히 데이터 벡터와 헤더 벡터를 수퍼 클래스에 전달합니다.
누군가가 문제를 해결하는 데 도움이되기를 바랍니다. 미리 감사드립니다. 당신이 경우에 Vector<Vector>
을 기반으로 Vector
하지만 JTable 일반 반환에 노력하기 때문에
더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/) – mKorbel