Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Clicar sobre JTable

Hola,

Tengo unos problema con un JTable.

Tengo un programa donde se abre una ventana y en esa venta se me muestra un JTable con los datos de unos productos de una BD, y los puedo seleccionar.

Primer problema:
Hay un boton, que me lleva a una ventana en la cual agrego un nuevo producto a la BD, y cuando cierro esa ventana, vuelvo a la ventana del JTable y me muestra ese nuevo producto que he creado, PERO NO ME DEJA SELECCIONARLO, para poder seleccionarlo tengo que cerrar la ventana del JTable y volverla a abrir, y ya si me deja seleccionarlo.

Segundo problema
En la ventana del JTable tambien tengo un boton para eliminar un producto de la jtable y por consiguiente de la BD, para eliminarlo lo primero que hago es seleccionar el producto, le doy al boton para eliminarlo y me lo elimina (tanto del JTable como de la BD), Hasta aqui todo bien. Pero si selecciono otra fila del JTable me vuelve a aperecer el producto que elimine, aunque no este ya en la BD.

Os pongo el codigo de como recojo el click en el JTable por si hago algo mal.

tabla.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
int fila = tabla.rowAtPoint(e.getPoint());
seleccionado = modelo.getValueAt(fila, 0).toString();
}
});

agosto 28, 2015 | Unregistered CommenterJose

El problema es sin duda en como cargas tus datos al jtable, imagino que por eso vuelve aparecer el dato eliminado (especulaciones mías ).

publica tu código,porque con lo que has publicado no se puede saber que es lo que ocasiona tu problema.
(por lo menos las clases que interactúan con el jtable).

saludos

agosto 28, 2015 | Registered Commenterjhosep

Buenas, te paso el codigo de la ventana donde se muestra el JTable

public class VentanaProductos extends JDialog {

private final JPanel contentPanel = new JPanel();
private JTextField textBuscar;
private JTable tabla;
private JScrollPane JS;

//Se obtiene la conexion a la BD
Connection conn = Conexion.estableceConexion();
private static String seleccionado = null;

/**
* Launch the application.
*/
public static void main(String[] args) {
try {
VentanaProductos miVentanaProductos = new VentanaProductos();
miVentanaProductos.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
miVentanaProductos.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Create the dialog.
* @param b
* @param miVentanaPrincipal
*/
public VentanaProductos() {

CargarProductos();
setModal(true);
setBounds(300, 100, 710, 452);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);


//Botón Nuevo
JButton btnNuevo = new JButton("Nuevo");
btnNuevo.setBounds(139, 363, 89, 23);
btnNuevo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
NuevoProducto miNuevoProducto = new NuevoProducto();
miNuevoProducto.setVisible(true);
CargarProductos();
}
});
contentPanel.setLayout(null);
contentPanel.add(btnNuevo);

//Botón Consultar ficha
JButton btnFicha = new JButton("Consultar ficha");
btnFicha.setBounds(238, 363, 126, 23);
btnFicha.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
FichaProducto miFichaProducto = new FichaProducto();
if(seleccionado != null){
miFichaProducto.setVisible(true);
CargarProductos();
}
else{
JOptionPane.showMessageDialog(null,"No ha seleccionado ningun producto.","AVISO", JOptionPane.INFORMATION_MESSAGE);
}

}
});
contentPanel.add(btnFicha);

//Botón Eliminar
JButton btnEliminar = new JButton("Eliminar");
btnEliminar.setBounds(374, 363, 89, 23);
btnEliminar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int respuesta = JOptionPane.showConfirmDialog(null, "¿Estas seguro de eliminar el producto?", "AVISO", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if(JOptionPane.YES_NO_OPTION == respuesta){
EliminarProducto();
JOptionPane.showMessageDialog(null,"El producto se ha eliminado.","", JOptionPane.INFORMATION_MESSAGE);
CargarProductos();
}
};
});
contentPanel.add(btnEliminar);

//Botón Salir
JButton btnSalir = new JButton("Salir");
btnSalir.setBounds(473, 363, 89, 23);
btnSalir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
VentanaProductos.this.dispose();
}
});
contentPanel.add(btnSalir);

//Botón Buscar
JButton btnBuscar = new JButton("Ok");
btnBuscar.setBounds(512, 296, 50, 22);
contentPanel.add(btnBuscar);


textBuscar = new JTextField();
textBuscar.setBounds(322, 296, 180, 22);
contentPanel.add(textBuscar);
textBuscar.setColumns(10);

JComboBox cbBuscar = new JComboBox();
cbBuscar.setBounds(210, 296, 102, 22);
cbBuscar.setToolTipText("Buscar por:");
cbBuscar.setModel(new DefaultComboBoxModel(new String[] {"Código", "Nombre"}));
contentPanel.add(cbBuscar);

JLabel lblBuscar = new JLabel("Buscar por:");
lblBuscar.setBounds(139, 295, 61, 23);
lblBuscar.setFont(new Font("Tahoma", Font.PLAIN, 12));
contentPanel.add(lblBuscar);

JLabel lblProductos = new JLabel("Productos");
lblProductos.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblProductos.setBounds(33, 11, 89, 23);
contentPanel.add(lblProductos);

tabla.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e)
{
int fila = tabla.rowAtPoint(e.getPoint());
seleccionado = modelo.getValueAt(fila, 0).toString();
}
});

}

private void CargarProductos(){
DefaultTableModel modelo = new DefaultTableModel(){
public boolean isCellEditable(int row, int column){
return false;
}
};

//Se establece el nombre de las columnas para la tabla Productos
modelo.addColumn("Código");
modelo.addColumn("Nombre");
modelo.addColumn("Descripción");
modelo.addColumn("Tipo");

tabla = new JTable(modelo);
tabla.getColumnModel().getColumn(0).setPreferredWidth(40);
tabla.getColumnModel().getColumn(3).setPreferredWidth(40);
JS = new JScrollPane(tabla);
JS.setBounds(33, 36, 636, 200);
contentPanel.add(JS);


PreparedStatement consulta;

try {
consulta = conn.prepareStatement("select cod_producto,nombre_pro,descripcion_pro,tipo from producto");
ResultSet resultado = consulta.executeQuery();

while(resultado.next()){
String codigo = resultado.getString("cod_producto");
String nombre = resultado.getString("nombre_pro");
String descripcion = resultado.getString("descripcion_pro");
String tipo = resultado.getString("tipo");

//Se añade la fila con los datos extraidos de la BD en la tabla Productos
modelo.addRow(new String[]{codigo,nombre,descripcion,tipo});
}

tabla.setModel(modelo);

consulta.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


private void EliminarProducto(){
try {

PreparedStatement st = conn.prepareStatement("DELETE FROM producto WHERE cod_producto='"+seleccionado+"'");
st.executeUpdate();

st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

static String getProducto(){
return seleccionado;
}
}

Yo pienso igual que tu, pero es que llevo un tiempo atascado y ya no lo veo.

Muchas gracias de antemano

agosto 28, 2015 | Unregistered CommenterJose

En el metodo EliminarProducto() no veo donde eliminas del jtable,

debería tener algo asi:

DefaultTableModel modelo= (DefaultTableModel) tabla.getModel();
dtm.removeRow(jTableProducto.getSelectedRow());

por eso es que solo se elimina de la bd, y vuelve aparecer en la tabla es decir nunca se fue.
otra solución, y debo decir poco ortodoxa pero te va funcionar es que recargues el modelo de la base de
,es decir prácticamente es llamar a tu método cargarProducto (pero para ello debes modificar algo, te mencionare después lo que debes modificar).

Ahora lo de insertar.
veo que llamas a CargarProducto, asi que lo que haces es recargar tu modelo como te menciones
mas arriba, pero ahí tienes el problema que construyes el jtable
lo que te provoca ese efecto de no poder seleccionar, así que quita esa inicialización y
ponla en el constructor

private void CargarProductos(){
DefaultTableModel modelo = new DefaultTableModel(){
public boolean isCellEditable(int row, int column){
return false;
}
};

//Se establece el nombre de las columnas para la tabla Productos
modelo.addColumn("Código");
modelo.addColumn("Nombre");
modelo.addColumn("Descripción");
modelo.addColumn("Tipo");
//aqui eliminas el codigo de inicializacion del jtable
//este código lo pasas a tu costructor, no te olvides de eso
//que sino vas a tener nulos y ni te va aparecer la tabla.

PreparedStatement consulta;

try {
consulta = conn.prepareStatement("select cod_producto,nombre_pro,descripcion_pro,tipo from producto");
ResultSet resultado = consulta.executeQuery();

while(resultado.next()){
String codigo = resultado.getString("cod_producto");
String nombre = resultado.getString("nombre_pro");
String descripcion = resultado.getString("descripcion_pro");
String tipo = resultado.getString("tipo");

//Se añade la fila con los datos extraidos de la BD en la tabla Productos
modelo.addRow(new String[]{codigo,nombre,descripcion,tipo});
}

tabla.setModel(modelo);

consulta.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

saludos, me cuentas

agosto 29, 2015 | Registered Commenterjhosep

Muchas gracias jhosep,
en cuanto lo pruebe te comento como me fue.

agosto 29, 2015 | Unregistered CommenterJose

Hola Joshep de nuevo.

Lo de eliminar si me funciona perfecto ahora. Me elimina el producto de la BD y del JTable, y si selecciono otro producto no me vuelve a aparecer el que elimine anteriormente.

Ahora el problema es que cuando creo un nuevo producto, NO me lo agrega al JTable, tengo que cerrar la ventana VentanaProductos.java y volverla a abrir para que aparezca el nuevo.

He hecho lo siguiente pero no funciona:

El codigo de inicialización del JTable lo pase al constructor y lo elimine de la funcion CargarProductos(), tal y como me dijiste.

Para agregar un nuevo producto a la BD lo que hago es que al presionar el boton "Nuevo", se abre una ventana y es aquí donde agrega ese producto a la BD. Esto lo hace perfecto.

Una vez creado el producto llamo a la funcion CargarProductos() para que muestre los productos en el JTable, lo hago aquí:

//Botón Nuevo
JButton btnNuevo = new JButton("Nuevo");
btnNuevo.setBounds(139, 363, 89, 23);
btnNuevo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//ABRO LA VENTANA DONDE SE CREA EL PRODUCTO EN LA BD
NuevoProducto miNuevoProducto = new NuevoProducto();
miNuevoProducto.setVisible(true);
//UNA VEZ CREADO, LLAMO A LA FUNCION CargarProductos() PARA QUE RELLENE EL JTABLE
CargarProductos();
}
});
contentPanel.setLayout(null);
contentPanel.add(btnNuevo);

No se si cuando llamo a la funcion CargarProductos() dentro del boton "Nuevo" es correcto o no.

Espero tu respuesta.

Te agradezco mucho la atención que me estás prestando.

agosto 29, 2015 | Unregistered CommenterJose

Hola @jose, imagino que NuevoProducto, no es un dialogo modal.
de ser asi tienes dos opciones o haces NuevoProducto un Dialogo modal
o llamar a CargarProductos() desde NuevoProducto.
Lo de modal es porque te bloquea el flujo de tu algoritmo hasta que se cierre la ventana, asi que cuando llames a CargarProducto ya existe este nuevo producto en la bd. no como ahorita que lo llamas antes y aun no esta el producto.

Ahora para realizar lo de llamar CargarProducto desde NuevoProducto que es la otra solucion tenes que tener una referencia de VentanaProducto en NuevoProducto y asi poder llamar a CargarProducto.

entonces podrias ser algo asi

//Botón Nuevo
JButton btnNuevo = new JButton("Nuevo");
btnNuevo.setBounds(139, 363, 89, 23);
btnNuevo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//ABRO LA VENTANA DONDE SE CREA EL PRODUCTO EN LA BD
NuevoProducto miNuevoProducto = new NuevoProducto(this);
//el this es la referencia de VentaProducto, para poder llamar a CargarProducto
miNuevoProducto.setVisible(true);
//El cargarProducto lo haras desde NuevoProducto
}
});


ahora si lo quieres hacer modal NuevoProducto, pues deberias extender de Dialog, y decirle que sea modal

aunque creo que con esto no tendrias problemas te dejo algunos links
http://chuwiki.chuidiang.org/index.php?title=JOptionPane_y_di%C3%A1logos_modales
http://acercadejava.blogspot.com/2010/07/dialogos-modales-y-no-modales-en-java.html

agosto 29, 2015 | Registered Commenterjhosep

Hola nuevamente,

La cuestion es que ya lo tengo modal, te indico como lo hago, vaya a ser que lo realice mal:

public class NuevoProducto extends JDialog {

private final JPanel contentPanel = new JPanel();
private JTextField textCodigo;
private JTextField textNombre;
private JTextField textDescripcion;
private JTextArea textNota;
private JFormattedTextField textPrecioPVP;
private JFormattedTextField textPrecioSocio;
private JFormattedTextField textPrecioCliente;


private JComboBox cbFamilia;

//Obtenemos la conexion a la BD
Connection conn = Conexion.estableceConexion();

/**
* Launch the application.
*/
public static void main(String[] args) {
try {
NuevoProducto miNuevoProducto = new NuevoProducto();
miNuevoProducto.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
miNuevoProducto.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Create the dialog.
* @param actionListener
* @param b
* @param miVentanaPrincipal
*/
public NuevoProducto() {
setResizable(false);

//AQUÍ ES DONDE LO HAGO MODAL (supongo que será así)
setModal(true);


setBounds(300, 100, 710, 352);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
contentPanel.setLayout(null);

JLabel lblCodigo = new JLabel("C\u00F3digo:");
lblCodigo.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblCodigo.setBounds(28, 11, 41, 20);
contentPanel.add(lblCodigo);

textCodigo = new JTextField();
textCodigo.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
//Máximo 10 caracteres
if(textCodigo.getText().length()>9){
e.consume();
}
}
});
textCodigo.setBounds(79, 12, 92, 20);
contentPanel.add(textCodigo);
textCodigo.setColumns(10);

JLabel lblNombre = new JLabel("Nombre:");
lblNombre.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblNombre.setBounds(266, 11, 52, 20);
contentPanel.add(lblNombre);

textNombre = new JTextField();
textNombre.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
//Máximo 25 caracteres
if(textNombre.getText().length()>24){
e.consume();
}
}
});
textNombre.setColumns(10);
textNombre.setBounds(342, 12, 324, 20);
contentPanel.add(textNombre);

JLabel lblFamilia = new JLabel("Familia:");
lblFamilia.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblFamilia.setBounds(28, 68, 41, 20);
contentPanel.add(lblFamilia);

cbFamilia = new JComboBox();
cbFamilia.setModel(new DefaultComboBoxModel(new String[] {"Panaderia", "Confiteria"}));
cbFamilia.setBounds(79, 68, 92, 19);
contentPanel.add(cbFamilia);

JLabel lblDescripcion = new JLabel("Descripci\u00F3n:");
lblDescripcion.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblDescripcion.setBounds(266, 68, 65, 20);
contentPanel.add(lblDescripcion);

textDescripcion = new JTextField();
textDescripcion.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
//Máximo 50 caracteres
if(textDescripcion.getText().length()>49){
e.consume();
}
}
});
textDescripcion.setColumns(10);
textDescripcion.setBounds(342, 69, 324, 20);
contentPanel.add(textDescripcion);

//Se crea una mascara para el formato de los precios de los productos
MaskFormatter mascara = null;
try {
mascara = new MaskFormatter("####.##");
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

JLabel lblPrecioPvp = new JLabel("Precio PVP:");
lblPrecioPvp.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblPrecioPvp.setBounds(28, 123, 78, 20);
contentPanel.add(lblPrecioPvp);

textPrecioPVP = new JFormattedTextField(mascara);
textPrecioPVP.setBounds(116, 124, 92, 20);
textPrecioPVP.setValue("0000.00");
contentPanel.add(textPrecioPVP);

JLabel lblPrecioSocio = new JLabel("Precio Socio:");
lblPrecioSocio.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblPrecioSocio.setBounds(28, 154, 78, 20);
contentPanel.add(lblPrecioSocio);

textPrecioSocio = new JFormattedTextField(mascara);
textPrecioSocio.setBounds(116, 155, 92, 20);
textPrecioSocio.setValue("0000.00");
contentPanel.add(textPrecioSocio);

JLabel lblPrecioCliente = new JLabel("Precio Cliente:");
lblPrecioCliente.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblPrecioCliente.setBounds(28, 185, 78, 20);
contentPanel.add(lblPrecioCliente);

textPrecioCliente = new JFormattedTextField(mascara);
textPrecioCliente.setBounds(116, 186, 92, 19);
textPrecioCliente.setValue("0000.00");
contentPanel.add(textPrecioCliente);

JLabel lblNota = new JLabel("Notas:");
lblNota.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblNota.setBounds(266, 123, 41, 20);
contentPanel.add(lblNota);

JPanel panel = new JPanel();
panel.setBounds(342, 122, 324, 83);
contentPanel.add(panel);
panel.setLayout(null);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(0, 0, 324, 83);
panel.add(scrollPane);

textNota = new JTextArea();
textNota.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
//Máximo 250 caracteres
if(textNota.getText().length()>249){
e.consume();
}
}
});
scrollPane.setViewportView(textNota);
textNota.setLineWrap(true);
textNota.setToolTipText("");
textNota.setWrapStyleWord(true);

//Botón Aceptar
JButton btnAceptar = new JButton("Aceptar");
btnAceptar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(textNombre.getText().equals("") || textCodigo.getText().equals("")){
JOptionPane.showMessageDialog(null,"Los campos Código y Nombre son obligatorios.","AVISO", JOptionPane.INFORMATION_MESSAGE);
}

else{
if(compara()==0){
int respuesta = JOptionPane.showConfirmDialog(null, "¿Estas seguro de crear el nuevo producto?", "AVISO", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

if(JOptionPane.YES_NO_OPTION == respuesta){
//Guardo el producto
GuardarProducto();

JOptionPane.showMessageDialog(null,"El producto se ha creado.","AVISO", JOptionPane.INFORMATION_MESSAGE);
textCodigo.setText("");
textNombre.setText("");
textDescripcion.setText("");
textNota.setText("");
textPrecioPVP.setValue("0000.00");
textPrecioSocio.setValue("0000.00");
textPrecioCliente.setValue("0000.00");
}
}

else{
JOptionPane.showMessageDialog(null,"Ya existe un producto con ese código.\nIntroduce otro código.","AVISO", JOptionPane.INFORMATION_MESSAGE);
}
}
}
});
btnAceptar.setBounds(257, 273, 89, 23);
contentPanel.add(btnAceptar);


//Botón Salir
JButton btnSalir = new JButton("Salir");
btnSalir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
NuevoProducto.this.dispose();
}
});
btnSalir.setBounds(356, 273, 89, 23);
contentPanel.add(btnSalir);
}

private void GuardarProducto(){
String codigo = textCodigo.getText();
String nombre = textNombre.getText();
String descripcion = textDescripcion.getText();
String tipo = (String)cbFamilia.getSelectedItem();
String nota = textNota.getText();
String PrecioPVP = textPrecioPVP.getText();
String PrecioCliente = textPrecioCliente.getText();
String PrecioSocio = textPrecioSocio.getText();


Statement st;

try {
st = conn.createStatement();
st.execute("INSERT INTO producto VALUES('"+codigo+"','"+nombre+"','"+descripcion+"','"+PrecioPVP+"','"+PrecioSocio+"','"+PrecioCliente+"','"+nota+"','"+tipo+"')");

st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private int compara(){
int encontrado = 0;
try {
Statement consulta = conn.createStatement();
ResultSet resultado = consulta.executeQuery("select * from producto");

while(resultado.next()){
if(resultado.getString("cod_producto").equals(textCodigo.getText())){
encontrado = 1;
}
}
consulta.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return encontrado;
}
}

Muchas gracias de nuevo, no sabes lo agradecido que te estoy

agosto 29, 2015 | Unregistered CommenterJose

Entonces, al final tu dialogo te inhabilita tu otro dialogo? es raro lo de setModal(true) deberia bastar, talves es porque VentaProducto es otro dialogo? .

bueno si no lo has resuelto, te sugeriría que optaras por la parte de llamar a CargarProducto() desde NuevoProducto. Como te lo mencione en mi mensaje anterior.

Y me alegro que mi ayuda te fuera util.

saludos.

agosto 31, 2015 | Unregistered Commenterjhosep

Buenas,

Si, tanto VentanaProducto (la ventana principal), como NuevoProducto(la ventana secundaria) son Dialog.

Probaré a llamar a CargarProductos() desde NuevoProducto

Muchas gracias por todo.

agosto 31, 2015 | Unregistered CommenterJose