2014-02-13 4 views
-2

Jtable, 트리 버튼 및 텍스트 뷰가있는 창이 있습니다. 내가 textview에서 뭔가를 채운 다음 버튼을 클릭하면 쿼리 결과로 JTable이 생성됩니다. 나는 질의의 샘플 테이블을 가지고 프로그램을 시작한다. 내 문제는 단추를 클릭 할 때 쿼리를 실행하지만 JTable 원본이 사라지지 않고 새 데이터로 새 JTable이 나타나지 않는다는 것입니다. 제발 도와 주실 수 있습니까? 많은 감사와 나의 영어를 위해 유감스럽게 생각한다! 버튼 코드 :새로운 JTable을 생성 할 수 없습니다.

if (arg0.getActionCommand().contentEquals("Buscar Anteriores")){ 
Thread t = new Thread(new Runnable() { 
        @Override 
        public void run() { 

         BaseDeDatos baseAnt = new BaseDeDatos(); 
         ConversorResultSetADefaultTableModel conversar2 = new ConversorResultSetADefaultTableModel(); 
         ConversorResultSetADefaultTableModel conversorAnt = new ConversorResultSetADefaultTableModel(); 
         DefaultTableModel modelo = new DefaultTableModel(); 
         modelo = new DefaultTableModel(); 
         UI initAnt = new UI(); 
         baseAnt.estableceConexion(); 

         //initAnt.creaYMuestraVentana(); 

         ResultSet rsAnt = baseAnt.dameListaPersonas(); 
         conversar2.rellena(rsAnt, modelo); 
         initAnt.tomaDatos(modelo); 

        } 

모델

public static void rellena(ResultSet rs, DefaultTableModel modelo) 
    { 
     configuraColumnas(rs, modelo); 
     vaciaFilasModelo(modelo); 
     anhadeFilasDeDatos(rs, modelo); 
    } 

    /** 
    * Añade al DefaultTableModel las filas correspondientes al ResultSet. 
    * @param rs El resultado de la consulta a base de datos 
    * @param modelo El DefaultTableModel que queremos rellenar. 
    */ 
    private static void anhadeFilasDeDatos(ResultSet rs, 
      DefaultTableModel modelo) 
    { 
     int numeroFila = 0; 
     System.out.println("fila cogeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"); 
     if (rs == null) { 
     System.out.println("NULLLO"); 
     } 

     try 
     { 

     // Para cada registro de resultado en la consulta 
      while (rs.next()) 
      { 
       // Se crea y rellena la fila para el modelo de la tabla. 
       Object[] datosFila = new Object[modelo.getColumnCount()]; 
       for (int i = 0; i < modelo.getColumnCount(); i++) 
        datosFila[i] = rs.getObject(i + 1); 
       modelo.addRow(datosFila); 
       numeroFila++; 
      } 
      rs.close(); 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 


    } 

    /** 
    * Borra todas las filas del modelo. 
    * @param modelo El modelo para la tabla. 
    */ 
    private static void vaciaFilasModelo(final DefaultTableModel modelo) 
    { 
     // La llamada se hace in un invokeAndWait para que se ejecute en el 
     // hilo de refresco de ventanas y evitar que salten excepciones 
     // durante dicho refresco. 
     try 
     { 
      SwingUtilities.invokeAndWait(new Runnable() 
      { 

       public void run() 
       { 
        while (modelo.getRowCount() > 0) 
         modelo.removeRow(0); 
       } 

      }); 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Pone en el modelo para la tabla tantas columnas como tiene el resultado 
    * de la consulta a base de datos. 
    * @param rs Resultado de consulta a base de datos. 
    * @param modelo Modelo de la tabla. 
    */ 
    public static void configuraColumnas2(final ResultSet rs, 
      final DefaultTableModel modelo) 
    { 

      System.out.println("CONNNNNNNNFIFFFFFGURAAAAAAAAANDDDDDDDDOOOOOOOOOOOO COLLLUUUUUUUMMMMMNAS"); 
      // Se hace en un invokeAndWait para que este código se ejecute 
      // en el hilo de refresco de ventanas, evitando que salten 
      // excepciones. 

         // Se obtiene los metadatos de la consulta. Con ellos 
         // podemos obtener el número de columnas y el nombre 
         // de las mismas. 
         ResultSetMetaData metaDatos; 
         try { 
          metaDatos = rs.getMetaData(); 
          int numeroColumnas; 
          numeroColumnas = metaDatos.getColumnCount(); 
          Object[] etiquetas = new Object[numeroColumnas]; 
          for (int i = 0; i < numeroColumnas; i++) 
          { 
           etiquetas[i] = metaDatos.getColumnLabel(i + 1); 
           System.out.println("etiquetas son .... " + etiquetas[i]); 

          } 

          modelo.setColumnIdentifiers(etiquetas); 

         } catch (SQLException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 

       } 

    public static void configuraColumnas(final ResultSet rs, 
      final DefaultTableModel modelo) 
    { 
     try 
     { 
      // Se hace en un invokeAndWait para que este código se ejecute 
      // en el hilo de refresco de ventanas, evitando que salten 
      // excepciones. 
      SwingUtilities.invokeAndWait(new Runnable() 
      { 

       public void run() 
       { 
        try 
        { 

         // Se obtiene los metadatos de la consulta. Con ellos 
         // podemos obtener el número de columnas y el nombre 
         // de las mismas. 
         ResultSetMetaData metaDatos = rs.getMetaData(); 

         // Se obtiene el numero de columnas. 
         int numeroColumnas = metaDatos.getColumnCount(); 

         // Se obtienen las etiquetas para cada columna 
         Object[] etiquetas = new Object[numeroColumnas]; 
         for (int i = 0; i < numeroColumnas; i++) 
         { 
          etiquetas[i] = metaDatos.getColumnLabel(i + 1); 
         } 

         // Se meten las etiquetas en el modelo. El numero 
         // de columnas se ajusta automáticamente. 
         modelo.setColumnIdentifiers(etiquetas); 
        } catch (Exception e) 
        { 
         e.printStackTrace(); 
        } 

       } 

      }); 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
+0

불필요을 전체 코드를 표시하지는 않지만 EDT에서 모델에 액세스하는 스레드를 시작하는 것처럼 보임) Swing의 단일 스레드 규칙을 위반 함 – kleopatra

답변

4

당신은 TableModel을 설정해야합니다에 데이터를 입력합니다.

Runnable.run()에서 새 DefaultTableModel을 만들고 로컬 변수 modelo에 할당합니다.

DefaultTableModel modelo = new DefaultTableModel(); 

그러나 새 테이블 모델 인스턴스를 가지고있는 JTable로 설정하는 호출은 없습니다. JTable에이 모델에 대한 참조가없는 경우 어떻게 변경 사항을 수신 할 수 있습니까?

당신은 이런 일을 수행해야합니다 : 당신으로 완전히 확신 할 수 없다 (가능성 :

DefaultTableModel modelo = new DefaultTableModel(); 
jTable.setModel(modelo); 

이 코드의 두 번째 줄은 조심

DefaultTableModel modelo = new DefaultTableModel(); 
modelo = new DefaultTableModel(); // remove this line 
관련 문제