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();
}
}
불필요을 전체 코드를 표시하지는 않지만 EDT에서 모델에 액세스하는 스레드를 시작하는 것처럼 보임) Swing의 단일 스레드 규칙을 위반 함 – kleopatra