2013-03-05 3 views
1

JTable 데이터를 새로 고치는 데 어려움을 겪고 있습니다.JTable 새로 고침 문제

나는 java.util.ArrayList<>를 수신하고 테이블 데이터를 읽을 곳에서 Object[][]를 구축하기이를 처리하는 방법으로, javax.swing.table.AbstractTableModel에서 확장 TableModel 내 자신을 구현하고있다.

좀 레코드 키와 함께하는 JList를 구현하고 있습니다를, 사용자가 하나를 선택하면, 방법은 열쇠를 집어 들고 그 해고와 관련된 기록을 가져 오기 위해 MySQL 데이터베이스를 조회한다 :

논리는 다음과 같습니다 그 열쇠. 최종 결과는 ArrayList <>이며 TableModel에 전달하여 데이터를 생성 한 다음이를 내 테이블에 설정합니다.

정상적으로 작동하지만 몇 안타가 지나면 테이블 데이터 표시가 중지되고 잠시 후 다시 작동하기 시작합니다. 테이블 또는 전체 GUI를 새로 고치는 데 문제가 있는지 잘 모르겠습니다. 빌드

방법 테이블의 데이터가 :

LoteTableModel ltm = new LoteTableModel(); 
arrayList = new ArrayList<Lote>(); 
ltm.createTableData(arrayList); 
myTable = new JTable(); 
myTable.setModel(ltm); 
scrollPane = new JScrollPane(myTable); 
: GUI를 시작할 때

public void createTableData(java.util.ArrayList<Lote> alLote) { 
    //Lote is an entity class modeling the database table. 
    TABLE_DATA = new Object[alLote.size()][TABLE_COLUMNS.length]; 
    //TABLE_DATA is an Object array, TABLE_COLUMNS is a String[] containing the names of the columns. 
    int i = 0; 
    for (Lote element : alLote) { 
     int j = 0; 
     TABLE_DATA[i][j++] = element.getFirstColumnValue(); 
     //and so son 
     i++; 
    } 
    super.fireTableDataChanged(); 
} 

, 그것은 빈 ArrayList를 <>로 시작

코드의 발췌 한 것입니다

테이블이 레코드가 없을 때 숨기고 결과가있는 경우를 보여주는 RowGroup과 테이블 컨테이너로 JScrollPane을 사용하고 있습니다.

다음
dgl = new DesignGridLayout(panel); 
dgl.row().center().group(group).add(scrollPaneContainingTable).fill(); 
centerPanel.add(panel, BorderLayout.CENTER); 
getContentPane().add(centerPanel); 
centerPanel.setVisible(true); 

은 매번 사용자가하는 JList에서 항목을 선택하고, 나는 데이터베이스를 조회하고 선택된 값에 관련된 기록을 가져 오기 : 내가 전에 언급 한 바와 같이

public void listSelectionChanged() { 
    bloque = alBloque.get(listBloque.getSelectedIndex()); 
    //bloque is another entity, alBloque is an ArrayList<Bloque> from which the JList (named listBloque) ListModel is constructed. 
    try { 
     //database query here, omitted 
     if (result.getStatus() == SUCCESS) { 
      //the query returned a populated ArrayList<Lote> 
      alLote = result.getArray(); 
      ((LoteTableModel) myTable.getModel()).createTableData(alLote); 
      myTable.revalidate(); 
     } 
    } catch (Exception e) {} 
} 

, 그것은 좋은 몇 일 목록에서 값을 클릭하면 관련 레코드가 테이블에 표시되지만 여러 레코드를 클릭하면 데이터 표시가 중단됩니다. 약간의 값을 다시 클릭하면 올바른 데이터가 다시 표시되므로 이전에 말했듯이 GUI가 상쾌한 문제인지 더 잘 모르겠습니다.

도움이 될 것입니다.

+1

예외를 삼키지 마십시오. – trashgod

+0

실제로 질문을 할 때 단축 목적이었습니다. 나는'java.io.IOException'과'ClassNotFoundException'에 대한 다중 패치를합니다. – Noe

+0

콘텐츠 창을 그리십시오. 그건 GUI를 새로 고칩니다. –

답변

1

나는이 문제를 발견했습니다, 그리고 내가 생각했던 내가 언급 한 바와 같이, 내가 DesignGridLayout을 사용하고

레이아웃 패키지 : 오용, 그것은 그것을하는 GUI의 문제가 아니었다 상쾌하지만, RowGroup이라는 일련의 행을 작성하여 GUI 숨기기/필요에 따라 숨기거나 표시하는 이점이 있습니다.

RowGroup에 테이블을 배치하고 데이터베이스에 결과가있을 때 show() 메서드를 호출하면 테이블에 이러한 결과가로드되어 표시됩니다. 결과를 찾을 수 없을 때 hide() 메서드를 호출 했으므로 테이블이 비어 있으므로 숨 깁니다.

요점은 hide() 메서드를 호출하는 것이 누적됩니다.메서드를 3 번 ​​호출하면 show() 메서드를 3 번 ​​호출하여 표시해야하므로 테이블에 빈 결과 집합이있는 JList에 3 개의 연속 행을 선택하면 호출 할 것입니다. hide() 메서드를 3 번 ​​반복 했으므로 실제로 테이블에 대한 결과가있는 행을 선택하면 show() 메서드가 한 번 호출되므로 테이블에 대한 결과가있는 행을 선택할 때까지 예상대로 테이블이 표시되지 않습니다.

나는 안타깝게도 DesignGridLayout 패키지 hide()가 호출 된 경우 테스트 할 isHide() 방법을 포함하지 않기 때문에, 한 번만 hide() 메소드를 호출하는 응용 프로그램을 강제로 제어 필드를 뒀다.

지원해 주셔서 감사합니다. 내 신비의 문제가 해결되었습니다.

+0

DesignGridLayout RowGroup은 상태가 없기 때문에'isHidden()'API를 가질 수 없다. 'show()'와'hide()'를 속한 행에 위임합니다. – jfpoilpret

+0

그러나 가능해야 할 것은 행과 행 그룹에 새로운 API를 추가하는 것입니다 (예 :'hide()'가 전에 여러 번 호출 된 경우에도 행 또는 행의 모든 ​​행을 표시하는'forceShow() ') . – jfpoilpret

+0

@jfpoilpret, 그건 대단한 것입니다. 나는 우리가 테스트 방법을 가질 수없는 이유를 이해하지만 행을 보여 주도록 강요하는 것도 유용합니다. 귀하의 의견에 감사드립니다. – Noe