Ayuda con Java - Jtables

rube83aqp

Bovino adicto
#1
Hola a todos
Estoy aprendiendo java por mi cuenta y tengo una duda:
Seguí los pasos de esta página: http://casidiablo.net/consultar-base-datos-java-mostrar-resultados-jtable/ y logré que funcione con postgreSQL.
Lo que quiero hacer -por ahora- es que la consulta se realice al presionar un Jbutton. Lo he tratado de acomodar, pero el resultado se muestra en el mismo Jframe donde está el botón, y lo que quisiera es que se muestre en una ventana aparte o en un área distinta de la misma ventana.
Estoy usando Netbeans y he creado un Jframeform y una clase con los siguientes códigos, con comentarios y todo:
No debe ser muy difícil, pero me estoy haciendo bolas, agradezco vuestra ayuda porfa :)

Código:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Buscar.java
 *
 * Created on 03/09/2011, 11:58:35 AM
 */

package Botonbusca;

import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

/**
 *
 * @author Sistemas
 */
public class Buscar extends javax.swing.JFrame {
    // controlador JDBC y URL de la base de datos
    static final String CONTROLADOR_JDBC = "org.postgresql.Driver";
    static final String URL_BASEDEDATOS = "jdbc:postgresql://localhost:5433/ejemplo?user=postgres&password=postgres";
    // la consulta predeterminada recupera todos los datos de la tabla autores
    static final String CONSULTA_PREDETERMINADA = "SELECT * FROM datos";
    private ModeloTablaResultados modeloTabla;
    private JTextArea areaConsulta;

    /** Creates new form Buscar */
    public Buscar() {
        super( "Mostrando resultados de la consulta" );
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jToggleButton1 = new javax.swing.JToggleButton();

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jToggleButton1.setText("Mostrar");
        jToggleButton1.setName("jToggleButton1"); // NOI18N
        jToggleButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(159, 159, 159)
                .addComponent(jToggleButton1)
                .addContainerGap(172, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(57, Short.MAX_VALUE)
                .addComponent(jToggleButton1)
                .addGap(220, 220, 220))
        );

        pack();
    }// </editor-fold>                        

    private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                               
        //super( "Mostrando resultados de la consulta" );
        // crear objeto ModeloTablaResultados y mostrar tabla de la base de datos
        try {
            // crear objeto TableModel para los resultados del a consulta SELECT * FROM autores
            modeloTabla = new ModeloTablaResultados( CONTROLADOR_JDBC, URL_BASEDEDATOS,
                    CONSULTA_PREDETERMINADA );
            JTable tablaResultados = new JTable(modeloTabla);

            getContentPane().setLayout(new BorderLayout());
            getContentPane().add( new JScrollPane(tablaResultados) , BorderLayout.CENTER );
            // establecer tamaño de ventana y mostrarla en pantalla
            setSize( 500, 250 );
            setVisible( true );
        }  // fin de bloque try
        // atrapar la excepción ClassNotFoundException lanzada por el
        // objeto ModeloTablaResultados si no se encuentra el controlador de la base de datos
        catch ( ClassNotFoundException claseNoEncontrada ) {
            JOptionPane.showMessageDialog( null,
                    "No se encontro el controlador de la base de datos", "No se encontro el controlador",
                    JOptionPane.ERROR_MESSAGE );
            System.exit( 1 );   // terminar la aplicación
        } // fin de bloque catch
        // atrapar la excepción SQLException lanzada por el objeto ModeloTablaResultados
        // si ocurren problemas al establecer la conexión a la base de datos
        // y realizar la consulta en la misma
        catch ( SQLException excepcionSQL ) {
            JOptionPane.showMessageDialog( null, excepcionSQL.getMessage(),
                    "Error en la base de datos", JOptionPane.ERROR_MESSAGE );
            // asegurar que la conexión a la base de datos esté cerrada
            modeloTabla.desconectarDeLaBaseDeDatos();
            System.exit( 1 );   // terminar la aplicación
        }
        // desechar la ventana cuando el usuario salga de la aplicación
        // (esta opción sobrescribe a la opción predeterminada de HIDE_ON_CLOSE)
        setDefaultCloseOperation( DISPOSE_ON_CLOSE );
        // asegurar que la conexión a la base de datos esté cerrada cuando el usuario salga de la aplicación
        addWindowListener(
                new WindowAdapter() {
                    // desconectarse de la base de datos y salir cuando se haya cerrado la ventana
                    public void windowClosed( WindowEvent evento ) {
                        modeloTabla.desconectarDeLaBaseDeDatos();
                        System.exit( 0 );
                    }
                }
        );
        // TODO add your handling code here:
    }                                              

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Buscar().setVisible(true);
            }
        });
        //new MostrarResultadosConsulta();
    }

    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JToggleButton jToggleButton1;
    // End of variables declaration                   

}
Código:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Botonbusca;
//import desktopapplication1.*;
import java.sql.*;
import java.util.*;
import javax.swing.table.*;
// Las filas y columnas del objeto ResultSet se cuentan desde 1 y las filas
// y columnas del objeto JTable se cuentan desde 0. Al procesar filas
// o columnas del objeto ResultSet para usarlas en un objeto JTable, es
// necesario sumar 1 al número de fila o columnas para manipular la
// columna apropiada del objeto ResultSet (es decir, la columna 0 del objeto
//JTable es la columna 1 del objeto ResultSet y la fila 0 del objeto JTable es
//la fila 1 del objeto ResultSet).
/**
 *
 * @author Sistemas
 */
public class ModeloTablaResultados extends AbstractTableModel{
    private Connection conexion;
    private Statement instruccion;
    private ResultSet conjuntoResultados;
    private ResultSetMetaData metaDatos;
    private int numeroDeFilas;
    //mantener el registro del estado de la conexión a la base de datos
    private boolean conectadoALaBaseDeDatos=false;
    //inicializar conjuntoResultados y obtener su objeto de meta datos
    //determinar el número de filas
    public ModeloTablaResultados(String controlador, String url,
            String consulta) throws SQLException, ClassNotFoundException{
        //cargar clase de controlador de base de datos
        Class.forName(controlador);
        //conectarse a la base de datos
        conexion=DriverManager.getConnection(url);
        //crear objeto Statement para consultar la base de datos
        instruccion=conexion.createStatement(
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);
        //actualizar el estado de la conexión a la base de datos
        conectadoALaBaseDeDatos=true;
        //establecer consulta y ejecutarla
        establecerConsulta(consulta);
    }
//obtener la clase que representa al tipo de coluna
    public Class getColumnClass(int columna) throws IllegalStateException{
        //asegurar que la conexión a la base de datos esté disponible
        if (!conectadoALaBaseDeDatos)
            throw new IllegalStateException("No hay conexión a la base de datos");
        //determinar la clase de Java de columna
        try{
            String nombreClase=metaDatos.getColumnClassName(columna+1);
            //devolver objeto Class que representa a nombreClase
            return Class.forName(nombreClase);
        }
        //atrapa excepciones SQLException y ClassNotFoundException
        catch (Exception excepcion){
            excepcion.printStackTrace();
        }
        //si ocurren problemas arriba, suponer que es tipo Object
        return Object.class;
    }
    //obtener el número de columnas en el objeto ResultSet
    public int getColumnCount() throws IllegalStateException{
        //asegurar que la conexión a la base de datos esté disponible
        if(!conectadoALaBaseDeDatos)
            throw new IllegalStateException("No hay conexión a la base de datos");
        //determinar el número de columnas
        try{
            return metaDatos.getColumnCount();
        }
        //atrapar excepciones SQLException e imprimir mensaje de error
        catch(SQLException excepcionSQL){
            excepcionSQL.printStackTrace();
        }
        //si ocurren problemas arriba, devolver 0 para el número de columnas
        return 0;
    }
    //obtener el nombre de una columna específica en el objeto ResultSet
    public String getColumnName(int columna) throws IllegalStateException{
        //asegurar que la base de datos esté disponible
        if(!conectadoALaBaseDeDatos)
            throw new IllegalStateException("No hay conexión a la base de datos");
        //determinar el nombre de la columna
        try{
            return metaDatos.getColumnName(columna+1);
        }
        //atrapar excepciones SQLException e imprimir mensaje de error
        catch (SQLException excepcionSQL){
            excepcionSQL.printStackTrace();
        }
        //Si hay problemas, devolver cadena vacía para el nombre de la columna
        return "";
    }
    //devolver el número de 11 filas en el objeto ResulSet
    public int getRowCount() throws IllegalStateException {
        //asegurar que la conexión a la base de datos esté disponible
        if(!conectadoALaBaseDeDatos)
            throw new IllegalStateException("No hay conexión a la base de datos");
        return numeroDeFilas;
    }
    //obtener un valor en una fila y columna específicas del objeto ResultSet
    public Object getValueAt(int fila, int columna) throws IllegalStateException{
        //asegurar que la conexión a la base de datosesté disponible
        if (!conectadoALaBaseDeDatos)
            throw new IllegalStateException("No hay conexión a la base de datos");
        //obtener un valor en una fila y columna específicas del objeto ResultSet
        try{
            conjuntoResultados.absolute(fila+1);
            return conjuntoResultados.getObject(columna+1);
        }
        //atrapar excepciones SQLexceptions e imprimir mensaje de error
        catch (SQLException excepcionSQL){
            excepcionSQL.printStackTrace();
        }
        //su hay problemas, devolver objeto cadena vacía
        return "";
    }
    //establecer nueva cadena de consulta para la base de datos
    public void establecerConsulta(String consulta)throws SQLException, IllegalStateException{
        //asegurar que la conexión a la base de datos esté disponible
        if(!conectadoALaBaseDeDatos)
            throw new IllegalStateException("No hay conexión a la base de datos");
        //especificar consulta y ejecutarla
        conjuntoResultados=instruccion.executeQuery(consulta);
        //obtener meta datos para el objeto ResultSet
        metaDatos=conjuntoResultados.getMetaData();
        //determinar el número de filas en el objeto ResultSet
        conjuntoResultados.last(); //mover a la última fila
        numeroDeFilas=conjuntoResultados.getRow(); //obtener número de fila
        //notificar al objeto JTable que el modelo ha cambiado
        fireTableStructureChanged();
    }
    //cerrar los objetos Statement y Connection
    public void desconectarDeLaBaseDeDatos(){
        // cerrar objetos Statement y Connection
        try{
            instruccion.close();
            conexion.close();
        }
        //atrapar excepciones SQLException e imprimir mensaje de error
        catch(SQLException excepcionSQL){
        excepcionSQL.printStackTrace();
        }
        //actualizar estado de conexión a la base de datos
        finally{
            conectadoALaBaseDeDatos=false;
        }
    }
}



java1 por santiagobruja, en Flickr


java2 por santiagobruja, en Flickr
 

ardon77

Bovino maduro
#2
hola lo que tienes es que mandar la consulta a otro componente ya se JTextArea, JTable, etc. Eso lo logras enviando la consulta atraves de un evento de JButton de esta forma.

// crear componente de escucha de eventos para botonEnviar consulta

botonEnviar.addActionListener(new ActionListener() {

public void actionPerformed( ActionEvent evento )
{

try {
// realizar una nueva consulta
modeloTabla.establecerConsulta(CONSULTA_PREDETERMINADA) );
}

// atrapar posibles excepciones SQLException al realizar una nueva consulta
catch ( SQLException excepcionSQL ) {
JOptionPane.showMessageDialog( null,
excepcionSQL.getMessage(), "Error en la base de datos",
JOptionPane.ERROR_MESSAGE );

// tratar de recuperarse de una consulta inválida del usuario
// ejecutando la consulta predeterminada
try {
modeloTabla.establecerConsulta( CONSULTA_PREDETERMINADA );
areaConsulta.setText( CONSULTA_PREDETERMINADA ); //Envia la consulta a un TextArea para nostrarlo en el JFrame.
}

// atrapar posible excepcion SQLException al realizar consulta predeterminada
catch ( SQLException excepcionSQL2 ) {
JOptionPane.showMessageDialog( null,
excepcionSQL2.getMessage(), "Error en la base de datos",
JOptionPane.ERROR_MESSAGE );

// asegurar que la conexión a la base de datos esté cerrada
modeloTabla.desconectarDeLaBaseDeDatos();

System.exit( 1 ); // terminar la aplicación

} // fin de bloque catch interno
} // fin de bloque catch externo
} // fin de actionPerformed
} // fin de la clase interna ActionListener
); // fin de la llamada a addActionListener


Esta es la Parte donde puedes redirigir tu consulta a donder la quieras.
areaConsulta.setText( CONSULTA_PREDETERMINADA ); //Envia la consulta a un TextArea para mostrarlo en el JFrame.
 
Arriba