2012-07-07 7 views
0

현재 MySQL로 JTable을 배우려고합니다. 내 데이터베이스를 JTable로 설정하고 스크롤 창을 사용하여 내 GUI에 추가했습니다.JTable, 버튼을 클릭 할 때마다 테이블을 업데이트하십시오.

제 질문은, 제 버튼을 클릭 할 때마다 제 데이터베이스를 갱신하거나 검색 작업을 수행하는 방법 (둘 다 똑같은 것입니다 ..)입니다. 여기

final Vector columnNames = new Vector(); 
     final Vector data = new Vector(); 

     try 
     { 
      // Connect to an Access Database 



      driver = IniFonksiyon.iniSVNOkut(driver, "databaseBilgileri", "driver");//"com.mysql.jdbc.Driver"; 
      url = IniFonksiyon.iniOkut(url, "databaseBilgileri", "url");//"jdbc:mysql://localhost:3306/"; 
      userid = IniFonksiyon.iniOkut(userid, "databaseBilgileri", "kullanici"); 
      password = IniFonksiyon.iniOkut(password, "databaseBilgileri", "sifre"); 
      dbName = IniFonksiyon.iniOkut(dbName, "databaseBilgileri", "dbIsmi"); 

      Class.forName(driver); 
      Connection connection = DriverManager.getConnection(url+dbName , userid, password); 

      // Read data from a table 

      String sql = "select * from profildb.tbl_detailed"; 
      Statement stmt = connection.createStatement(); 
      ResultSet rs = stmt.executeQuery(sql); 

      ResultSetMetaData md = rs.getMetaData(); 
      int columns = md.getColumnCount(); 

      // Get column names 

      for (int i = 1; i <= columns; i++) 
      { 
       columnNames.addElement(md.getColumnName(i)); 
      } 

      // Get row data 

      while (rs.next()) 
      { 
       Vector row = new Vector(columns); 

       for (int i = 1; i <= columns; i++) 
       { 
        row.addElement(rs.getObject(i)); 
       } 

       data.addElement(row); 
      } 

      rs.close(); 
      stmt.close(); 
      connection.close(); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 

     // Create table with database data 

     final JTable table = new JTable(data, columnNames) 
     { 
      /** 
      * 
      */ 
      private static final long serialVersionUID = 1L; 

      public Class getColumnClass(int column) 
      { 
       for (int row = 0; row < getRowCount(); row++) 
       { 
        Object o = getValueAt(row, column); 

        if (o != null) 
        { 
         return o.getClass(); 
        } 
       } 

       return Object.class; 
      } 
     }; 

이 테이블을 만들고 처리하는 코드입니다,하지만 직접 내 주요 GUI 기능과 연결 (내 .ini 파일에 데이터베이스 정보를 읽고있다) 내 코드 그래서 어떻게 검색 기능과 같은 다른 작업을 새로 고칠 수 있습니까?

답변

2

테이블 모델을 사용하는 것이 더 쉽습니다. 관련 tutorial을 참조하십시오. DefaultTableModel 또는 TableModel을 직접 구현할 수 있습니다. AbstractTableModel의 내선 번호는 일반적으로 DefaultTableModel이 사용자 요구를 충족시키지 않는 경우 가장 일반적인 방법입니다.

스윙 응용 프로그램의 성능과 응답 성을 높이려면 EDT에서 장시간 실행되는 작업이 발생하지 않아야합니다. 따라서 EDT 이외의 스레드에서 데이터베이스에 액세스하는 것이 가장 좋습니다.

SwingWorker은 이러한 목적으로 사용할 수 있습니다. SwingWorker.doInBackground()에 데이터베이스에서 데이터를 가져옵니다. 그런 다음 SwingWorker.done()에 모델을 작성하거나 업데이트하십시오.

이러한 구현에는 많은 변형이 있습니다. 이는 응용 프로그램의 성격과 요구 사항에 따라 다릅니다. 예를 들어 SwingWorker의 publish()/process() 탠덤을 사용하여 데이터를 청크로 처리 할 수 ​​있습니다. 모델에 데이터베이스 액세스 논리를 통합하거나 SwingWorker까지 확장되는 명령을 만들도록 선택할 수 있습니다.

+0

안녕하세요, 고맙습니다. 이해합니다. 그렇다면 직접 코드에 DefaultTableModel을 구현할 수 있습니까? 아니면 테이블의 코드를 변경해야합니까? –

+0

@Yesilmen, DefaultTableModel 또는 TableModel의 독자적인 구현. 모델이 실제 데이터를 관리하도록하고 테이블이 프레젠테이션을 담당하도록하십시오. – tenorsax

관련 문제