2012-04-11 4 views
2

그래서 JTable으로 작업 중이므로 열 A-K이 있습니다. 이 유일한 편집 가능한 것입니다. 누군가가에 빈 행을 편집 할 경우, 나는 API 호출이 다음 B 내가 누군가 B에 빈 행을 편집 exists.If B, 내가하는 모든 행을 얻을 수있는 DB 호출을받을 수 있도록 the와 같은 호출이 해당 행의 DB에서도 검색됩니다. 이 호출은 0-N 행을 반환합니다. 0 행이 반환 된 경우 B을 제외한 모든 행의 값을 N/A로 변경합니다. 그렇지 않으면 데이터를 사용하여 행을 채 웁니다. 채워지면 모든 열을 편집 할 수 없게 만듭니다. DB 호출은 호출이 돌아 오면 내가 테이블 모델에 추가하는 자체 레코드 객체를 생성하기 때문에 자체 스레드에서 발생합니다.변경시 JTable로드 값,로드하는 동안 진행률 표시 줄

나는 데이터를 유지하고 변경된 값을 처리하기 위해 TableModelTableModelListener을 가지고 있습니다.

여기가 내 문제입니다. TableCellRenderer을 사용하고 cellrenderer을 사용하여 값이 변경되었는지 확인합니다. 그렇다면 호출을 만들고 필요에 따라 채 웁니다. DB에서 많은 수의 행을 가져 오면 모든 레코드를로드하고 작성하는 데 약간의 시간이 걸리므로 ProgressBar을 사용하여 사용자가 화면이 고정되어 있지 않다는 사실을 보여 주려고했습니다. . 그러나 나타나는 프레임은 공백이며 아무 것도 표시되지 않습니다. 부적절하게 또는 뭔가를 놓치고있는 느낌을받습니다. 많은 도움을 주셨습니다.

일부 코드

내가 서식 문제

답변

4

에 대한 당신의 TableModel 당신이 당신의 결과를 살펴으로 설정을 업데이트 할 수 있습니다 사용 SwingWorker을 약

public class MyPanel extends JPanel { 
    private JTable myTable; 
    private MyTableModel tm; 
    //OTHER FIELDS 

    public static void createPanel() { 
      tm = new MyTableModel(columnnames); 
      myTable = new JTable(tm); 

      TableColumn account = myTable.getColumnModel().getColumn(
      MyTableModel.ACCOUNT_INDEX); 
    account.setCellRenderer(new MyTableRenderer(
      MyTableModel.ACCOUNT_INDEX)); 
    } 
} 

public class MyTableRenderer extends DefaultTableCellRenderer{ 

    protected int interactiveColumn; 

    public MyTableRenderer(int interactiveColumn) { 
     this.interactiveColumn = interactiveColumn; 
    } 

    public Component getTableCellRendererComponent(JTable table, 
      Object value, boolean isSelected, boolean hasFocus, int row, 
      int column) { 
     Component c = super.getTableCellRendererComponent(table, value, 
       isSelected, hasFocus, row, column); 
     if (column == interactiveColumn && hasFocus) { 
      //DO DB and API CALLS HERE 
      //IF DB CALL DISPLAY A NEW FRAME WITH PROGRESSBAR 
     } 
     return c; 
    } 
} 

죄송 이야기하고 이해합니다.

부록 : TableModel을 렌더러에서 업데이트하지 마십시오. CellEditor 구현이 완료되면 getCellEditorValue()에 적합한 작업자를 시작하여 모델을 업데이트 할 수 있습니다. 그런 식으로 수정 된 데이터는 렌더러가 수정 된 셀 (들)에 대해 다음에 호출 될 때 사용할 수 있습니다. 이 관련 내용 example은 접근 방식에 대해 간략하게 설명합니다.

부록 : getCellEditorValue()은 편집이 끝난 후 호출되지만 setValueAt()에서 작업자를 시작하면 대상 행과 열에 더 안정적으로 액세스 할 수 있습니다.

+0

흠, 미안하지만 분명히 자신을 설명하지 못했습니다. 결과 집합을 사용하고 레코드 개체를 만들려면 SwingWorker를 사용하고 있습니다. 그러나 스윙 워커의 테이블 모델에 레코드 객체를 추가하는 것이 아니라 테이블 셀 렌더러에 추가하는 것입니다. 사용자가 방금 편집 한 열에 집중하지 못하면 내 명령을 실행하고 일부 검색 후 원하는 코드를 찾았습니다. 당신이 추천 할 수있는 변경시 행을 업데이트 할 수있는 대체 방법이 있습니까? – dsymquen

+1

이를 위해 'CellEditor'가 필요합니다. 이상. – trashgod

+0

고마워, 나는 내 접근 방식이 최고라고 생각하지 않았다. 이것은 많은 도움이된다. – dsymquen