Foro sobre Java SE > Como refrescar Jtable para que muestre datos
¿Puedes copiar aquí las clases Modelo y TablePane?
Hola estas son mis dos clases.
package presentacion.gui;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;
/**
*
* Almacena toda la información sobre los paquetes
* visualizados en la tabla presente en la interfaz principal de la
* aplicación.
*
*/
class ModeloDatos extends AbstractTableModel {
Vector tableColumns = new Vector();
Vector tableData = new Vector();
public Vector newRow;
/**
* Constructor.
*/
@SuppressWarnings("unchecked")
public ModeloDatos(){
tableColumns.addElement(new String("Num"));
tableColumns.addElement(new String("Time"));
tableColumns.addElement(new String("Size"));
tableColumns.addElement(new String("MAC Src"));
tableColumns.addElement(new String("MAC Dest"));
tableColumns.addElement(new String("Frame"));
tableColumns.addElement(new String("Protocol"));
tableColumns.addElement(new String("IP Src"));
tableColumns.addElement(new String("IP Dest"));
tableColumns.addElement(new String("Port Src"));
tableColumns.addElement(new String("Port Dest"));
tableColumns.addElement(new String("SEQ"));
tableColumns.addElement(new String("ACK"));
tableColumns.addElement(new String("Length"));
}
//unicamente retornamos el numero de elementos del array
// de los nombre de columnas
public int getColumnCount(){
return tableColumns.size();
}
// retornamos el numero de elementos del array de datos
public int getRowCount(){
return tableData.size();
}
//retornamos el elemento indicado
public String getColumnName(int col){
return (String)tableColumns.elementAt(col);
}
// lo mismo para las celdas
public Object getValueAt(int row,int col){
Vector rowVector = (Vector)tableData.elementAt(row);
return rowVector.elementAt(col);
}
/** Este metodo sirve para determinar el editor predeterminado para cada una de las
* celdas **/
@SuppressWarnings("unchecked")
public Class getColumnClass(int c){
return getValueAt(0,c).getClass();
}
public void newVector(){
newRow = new Vector();
}
@SuppressWarnings("unchecked")
public void addRow(String num,String ttl, String size,String macsource,String macdest,String frame,String protocol,String ipsrc,String ipdest,String portsrc,String portdest,String seq,String ack,String length){
newRow.addElement(num);
newRow.addElement(ttl);
newRow.addElement(size);
newRow.addElement(macsource);
newRow.addElement(macdest);
newRow.addElement(frame);
newRow.addElement(protocol);
newRow.addElement(ipsrc);
newRow.addElement(ipdest);
newRow.addElement(portsrc);
newRow.addElement(portdest);
newRow.addElement(seq);
newRow.addElement(ack);
newRow.addElement(length);
}
@SuppressWarnings("unchecked")
public void addTimeRow (String numeropaquete,String time,String size){
newRow.addElement(numeropaquete);
newRow.addElement(time);
newRow.addElement(size);
}
@SuppressWarnings("unchecked")
public void addPacket (){
tableData.addElement(newRow);
}
public void clear() {
tableData.clear();
}
}
package presentacion.gui;
import java.awt.Color;
import java.awt.event.InputEvent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import presentacion.VentanaInicial2;
/*****************************************
public class TablePane {
private boolean numeropaquete;
private boolean time;
private boolean macsource;
private boolean macdest;
private boolean frame;
private boolean protocol;
private boolean ipsrc;
private boolean ipdest;
private boolean portsrc;
private boolean portdest;
private boolean seq;
private boolean ack;
private boolean length;
private boolean size;
private JPanel Panel;
protected JScrollPane scrollPane;
private ModeloDatos modelo;
private JTable table;
private TableColumn column = null;
private ListSelectionModel listSelecionModel;
public VentanaInicial2 venpadre;
protected Color coloraplicar = Color.RED ;
public TablePane(VentanaInicial2 venpadre) {
this.venpadre = venpadre;
modelo = new ModeloDatos();
table = new JTable(modelo);
table.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
fileMouseClicked(evt);
}
});
table.getTableHeader().addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
tableMouseClicked(evt);
}
});
initColumnSizes(table);
}
private void tableMouseClicked(java.awt.event.MouseEvent evt) {
if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK){
// Opciones de table al pulsar el boton derecho sobre table.
//new FTableOptions(this).show();
}
}
private void fileMouseClicked(java.awt.event.MouseEvent evt) {
if ((evt.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK){
getfila(table.getSelectedRow());
}
}
/** Obtenercolumnas
Funcion que obtiene la los campos (columnas) de la cabecera de la tabla **/
public void obtenercolumnas (boolean numpaquete,boolean time,boolean macsource,boolean macdest,boolean frame,boolean protocol,
boolean ipsrc,boolean ipdest,boolean portsrc,boolean portdest,boolean seq,boolean ack,boolean length,boolean size){
this.numeropaquete = numpaquete;
this.time = time;
this.macsource = macsource;
this.macdest = macdest;
this.frame = frame;
this.protocol = protocol;
this.ipsrc = ipsrc;
this.ipdest = ipdest;
this.portsrc = portsrc;
this.portdest = portdest;
this.seq = seq;
this.ack = ack;
this.length = length;
this.size = size;
}
public void DatosPk(){
modelo.newVector();
}
public void DatosRawPaquete (String numeropaquete,Long time,int tamano){
modelo.addTimeRow(numeropaquete,String.valueOf(time),String.valueOf(tamano));
}
public void DatosPaquete(String num, String ttl , String size,String macsource,String macdest,String frame,String protocol,String ipsrc,String ipdest,String portsrc,String portdest,String seq,String ack,String length ) {
//// cogemos los datos que necesitamos para la tabla de cada paquete
modelo.addRow(num,ttl,size,macsource,macdest,frame,protocol,ipsrc,ipdest,portsrc,portdest,seq,ack,length);
modelo.addPacket();
}
public JTableHeader Cabezera (){
return table.getTableHeader();
}
public JTable Tabla(){
return table;
}
public void getfila(int fila) {
venpadre.CrearArbol(fila);
}
private void initColumnSizes(JTable table) {
column = table.getColumnModel().getColumn(0);
column.setPreferredWidth(60);
column = table.getColumnModel().getColumn(1);
column.setPreferredWidth(160);
column = table.getColumnModel().getColumn(2);
column.setPreferredWidth(40);
column = table.getColumnModel().getColumn(3);
column.setPreferredWidth(130);
column = table.getColumnModel().getColumn(4);
column.setPreferredWidth(130);
}
public void limpiarModelo() {
modelo.clear();
}
}
Lo que veo, a vista de pájaro, es que cuando añades filas nuevas en el modelo, no usas los "fire---" del AbstractTableModel , para que la tabla se entere de que ha habido cambios.
http://docs.oracle.com/javase/7/docs/api/javax/swing/table/AbstractTableModel.html
http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#fire
Muchisimas gracias, he añadido un modelo.fireTableDataChanged(); en el momento de añadir la fila y me actualiza perfectamente el JTable.
Buenas me podrian dar alcane de como poder construir un formulario que muestre una tabla con datos por ejemplo: un producto y su cantidad al costado pero que esta tabla se actualize sola lo que muestra. gracias de antemano si pueden guiarme.
La vista de la tabla se actualiza cuando modificas el modelo, o cuando disparas manualmente un evento.
Hola,
En primer lugar muchas gracias de antemano, soy novato en el manejo de interfaces gráficas con java y tengo el siguiente problema o duda.
MI aplicación tiene en su ventana principal un JTable en el que quiero mostrar los datos.
Para ello dispongo de un Modelo de datos que implenta AbstractTableModel.
Otras clase "TablePane" que me permite añadir filas a el modelo de datos anterior.
Una ventana inicial que extiende de JFrame y desde donde recibo los datos cargados en el "TablePane".
Con estos elementos consigo mostrar los elementos en mi JTable pero para que se vean tengo que redimensionar mi pantalla o hacer un pack() y lo que quiero es intentar obligar a que la pantalla se "refresque" pero sin usar el pack y sin tener que redimensionar la pantalla.
Muchas gracias y todos los consejos son bien recibidos.