2012-03-07 2 views
1

이것은 JTable 바인딩을 사용한 두뇌 크래킹 경험입니다. 여기 내가 한 일이있다. JTable 열을 지정된 너비로 설정하고 renderers을 사용하여 서식을 지정한 다음 일부 코드를 추가했습니다. 그러나 모델에 바인딩하려고하면 모든 열이 모델의 필드로 바뀌 었습니다. 올바르게 묶는 방법이 있습니까?JTable 모델을 설정하고 열 형식 (너비, 맞춤 등)을 보존합니다.

데이터베이스에 100 개 이상의 레코드가 있으므로 루프를 피할 수 있습니다. BeansBindingEntityManager과 같은 다른 방법을 사용하려고하지만 데이터 소스를 변경하는 방법을 모르겠습니다 (그 이유는 모델에 바인딩을 선택하기 때문입니다). 새 서버에 구현되었습니다.

이것은 내가 .Net에서 한 것입니다. 저는 보통 datagridview를 만들고 데이터 집합에 바인딩하여 정상적으로 작동합니다. 하지만 난 그것을 자바에 적용 할 수 없다. Java에서 100 개 이상의 레코드를 처리 할 수있는 방법에 대한 의견이 필요합니다.

PreparedStatement pst = conn.prepareStatement("SQL Query here"); 
    ResultSet rs = pst.ExecuteQuery(); 
    jTable1.setModel(DbUtils.resultSetToTableModel(rs)); 

위의 코드는 잘 작동하지만 내 아주 아주 큰 문제는 모델의 열을 기준으로 내 서식이 열을 무시한다는 것입니다.

도와주세요.

+0

이 DbUtils 당신에 의해 작성되어 완벽하게 작동 할 것인가? 직접 테이블 모델을 개발 했습니까? 이 경우 setResultSet (rs) 메서드를 추가하고 모델 이벤트를 트리거하여 테이블을 업데이트 할 수 있습니다. 아마도 열을 손상시키지 않을 것입니다. – dsboger

+0

@dsboger 아니오, 실제로 여기에서 가져 왔습니다. http://technojeeves.com/joomla/index.php/free/59-resultset-to-tablemodel jar 파일입니다. –

+0

resultSetToTableModel (rs)과 비슷한 updateTableModelFromResultSet (tModel, rs) 메서드를 만들 수 있지만 tModel.setDataVector (rows)를 호출하여 데이터를 업데이트합니다. 코드에 대한 도움이 필요하면 대답으로 바꿀 수 있습니다. – dsboger

답변

2

를 검색

public static void updateTableModelData(DefaultTableModel tModel, ResultSet rs) 
     throws Exception { 
    tModel.setRowCount(0); 
    ResultSetMetaData metaData = rs.getMetaData(); 

    while (rs.next()) { 
     Vector newRow = new Vector(); 
     for (int i = 1; i <= numberOfColumns; i++) { 
      newRow.addElement(rs.getObject(i)); 
     } 
     tModel.addRow(newRow); 
    } 
} 

를 다음 코드 된 것 : DbUtils에 다음 메서드를 추가하려고 울드

PreparedStatement pst = conn.prepareStatement("SQL Query here"); 
ResultSet rs = pst.ExecuteQuery(); 
DbUtils.updateTableModelData((DefaultTableModel) jTable1.getModel(), rs); 
+0

정말 고마워요. –

2

너무 광범위한 질문

, 정말보기로 100+ thousand records을 넣어하지 않음) 1,이 모든 프로그래밍을 언어, 정말 쓸모가 유효

2) (내 생각) BeansBindings이 out_dated되어 사용 기준 의 TableModel은 @camickr TableFromDatabase으로 더 나은 대신

3) 아무것도 주위에 없다, 또는 다른 제안은, 당신을 C 의견을 바탕으로 ResultSetTableModel

+0

정말 고마워요. –

0

리터 당신이 당신의 포맷 방법을 생성하고 아래와 같이 try 블록 후 호출 할 수 있음을 발견했다 .

private void UpdateTable() throws SQLException { 
    String sql = "select * from invoice"; 
    proDialog.setValue(10); 
    table.setShowHorizontalLines(true); 
    table.setShowVerticalLines(true); 
    proDialog.setValue(20); 
    try (
     PreparedStatement pst = con.prepareStatement(sql); 

      ResultSet rs = pst.executeQuery(); 

      ) 
      {   
     table.setModel(DbUtils.resultSetToTableModel(rs));   
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
    format();  
} 

public void format() { 
TableColumnModel m = table.getColumnModel(); 
m.getColumn(2).setCellRenderer(FormatRenderer.getDateTimeRenderer()); 
m.getColumn(1).setCellRenderer(FormatRenderer.getTimeRenderer()); 
m.getColumn(2).setCellRenderer(NumberRenderer.getPercentRenderer()); 
m.getColumn(4).setCellRenderer(NumberRenderer.getCurrencyRenderer()); 
m.getColumn(4).setCellRenderer(NumberRenderer.getPercentRenderer()); 
m.getColumn(5).setCellRenderer(NumberRenderer.getCurrencyRenderer()); 
}