2014-02-13 56 views
-2

我有一個Jtable,樹形按鈕和一個textview的窗口。我希望當我在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