-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();
}
}
當心:你很可能(不能完全肯定,因爲你不要顯示完整的代碼,但看起來像是開始一個線程訪問EDT的模型)違反了Swing的單線程規則 – kleopatra