Colocar Boton de Modificar en celda de JTable

Iniciado por Fernandez2494, 30 Septiembre 2018, 20:17 PM

0 Miembros y 1 Visitante están viendo este tema.

Fernandez2494

Buenas, estoy teniendo inconvenientes con un Formulario que cree, estoy queriendo colocar un boton en una celda de mi JTable para poder Modificar la fila seleccionada, tengo un formulario que me muestra todos los pedidos que fueron generados durante el dia con ayudar de un Text Field que con una clase "Fecha" genera la fecha para ese cuadro de texto, con una clase "CargarTabla" creo la consulta y lo cargo en mi Jtable cada vez que este se inicie de forma automatica, este es mi codigo, necesitaba una ayudar para saber donde modificar o que debo hacer. Desde ya gracias


Código (java) [Seleccionar]
private boolean CargarTabla() {
    boolean isOk = false;
    String sql = "";

    StatementManager sm = new StatementManager();
    try {
        DefaultTableModel dtm = (DefaultTableModel) jTablePedidos.getModel();
        sql = "SELECT vt.id_venta, sb.sabor as Sabor, vt.cantidad, vt.precio, vt.total"
                + "  FROM item_venta vt inner join sabores   sb on sb.id_sabor  = vt.id_sabor where fecha = '" + jTFechaCompra.getText() + "'"
                + "AND   pagado = 'N'";
        System.out.println(sql);
        sm.TheSql = sql;
        sm.EjecutarSql();
        while (sm.TheResultSet.next()) {
            dtm.addRow(new Object[]{sm.TheResultSet.getString("id_venta"),
                sm.TheResultSet.getString("sabor"), sm.TheResultSet.getString("cantidad"),
                sm.TheResultSet.getString("precio"),
                sm.TheResultSet.getString("total")});
        }

        jTablePedidos.setModel(dtm);
        isOk = true;
    } catch (Exception e) {
        e.printStackTrace();

    }
    return isOk;
}


rub'n

#1
Hola,

esto te puede servir



Creamos una constante tipo String para el PreparedStatement nuestra sentencia precompilada

Código (java) [Seleccionar]
private static final String UPDATE = "UPDATE customer SET first_name=?, last_name=? WHERE id=?";

Añadimos una columna que contendrá nuestro botón

Código (java) [Seleccionar]
defaultTableModel.addColumn("Update item");

Obtenemos el nombre de la columna y le seteamos los 2 objetos de las clases que permitiran el update
Código (java) [Seleccionar]
jTable.getColumn("Update item").setCellEditor(new UpdateItem());
jTable.getColumn("Update item").setCellRenderer(new BotonRenderizado());


Añadimos un mouseListener a la tabla para setear los valores en el form con el click , tu debes hacer el ajuste con tu código
Código (java) [Seleccionar]
 jTable.addMouseListener(new MouseAdapter() {
           @Override
           public void mouseClicked(MouseEvent e) {
               int seletedRow = jTable.getSelectedRow();
               DefaultTableModel defaultTableModel = (DefaultTableModel) jTable.getModel();
               jTextFieldID.setText(defaultTableModel.getValueAt(seletedRow, 0).toString());
               jTextFirsName.setText(defaultTableModel.getValueAt(seletedRow, 1).toString());
               jTextLastName.setText(defaultTableModel.getValueAt(seletedRow, 2).toString());
           }
       });



Creamos una clase que extiende de JButton

Código (java) [Seleccionar]
public class BotonRenderizado extends JButton implements TableCellRenderer {

    @Override
   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
       if (value != null) {
           setText("");
       } else {
           setText("update");
       }
       if (isSelected) {
           setForeground(table.getSelectionForeground());
           setBackground(table.getSelectionBackground());
       } else {
           setForeground(table.getForeground());
           setBackground(UIManager.getColor("Button.background"));
       }
       return this;
   }
}


Aquí es donde esta la verdadera lógica del botón en la tabla desde la linea 21 a 38 es un ejemplo que te pongo, tu debes de programarlo acorde a tu código

en la linea 33 puedes usar también DbUtils para ahorrarte mas lineas de código, sirve para refrescar la tabla

Código (java) [Seleccionar]
private class UpdateItem extends AbstractCellEditor implements TableCellEditor {

       private JButton editor = new JButton();
       private Object value;
       private int fila;
       private JTable table;

       public UpdateItem() {

           updateItem();

       }

       private void updateItem() {
           editor.addActionListener(e -> {
               if (table != null) {
                   fireEditingStopped();
                   TableModel model = table.getModel();
                   if (model instanceof DefaultTableModel) {
                       try {
                           int getrow = table.getSelectedRow();
                           final Long id = Long.valueOf(jTextFieldID.getText());
                           final String firstName = jTextFirsName.getText();
                           final String lastName = jTextLastName.getText();


                           final PreparedStatement ps = connection.prepareStatement(UPDATE);
                           ps.setString(1, firstName);
                           ps.setString(2, lastName);
                           ps.setLong(3, id);
                           ps.executeUpdate();

                           //DbUtils
                           model.setValueAt(id, getrow, 0);
                           model.setValueAt(firstName, getrow, 1);
                           model.setValueAt(lastName, getrow, 2);

                           JOptionPane.showMessageDialog(null, "Updated");

                       } catch (SQLException ex) {
                           ex.printStackTrace();
                       }
                   }
               }
           });
       }

       @Override
       public boolean isCellEditable(EventObject e) {
           return true;
       }

       @Override
       public Object getCellEditorValue() {
           return value;
       }

       @Override
       public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
           this.table = table;
           this.fila = row;
           this.value = value;
           if (value != null) {
               editor.setText("");
           } else {
               editor.setText("update");
           }
           if (isSelected) {
               editor.setForeground(table.getSelectionForeground());
               editor.setBackground(table.getSelectionBackground());
           } else {
               editor.setForeground(table.getForeground());
               editor.setBackground(UIManager.getColor("Button.background"));
           }
           return editor;
       }
   }



Código (java) [Seleccionar]
package foro;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.*;
import java.util.EventObject;

public class ConnectJDBCTest extends JFrame {

   private static final String URL = "jdbc:mysql://localhost:3306/demo?useSSL=false";
   private static final String USERNAME = "root";  //mala practica
   private static final String PASSWORD = "password"; // mala practica

   private static final String SELECT = "SELECT id, first_name, last_name FROM customer";
   private static final String UPDATE = "UPDATE customer SET first_name=?, last_name=? WHERE id=?";
   private static final String DELETE = "DELETE FROM customer where id = ";

   private DefaultTableModel defaultTableModel = new DefaultTableModel();
   private JTable jTable = new JTable(defaultTableModel);
   private JScrollPane jScrollPane = new JScrollPane(jTable);
   private Long id;
   private String firstName;
   private String lastName;

   private JTextField jTextFieldID = new JTextField(10);
   private JTextField jTextFirsName = new JTextField(10);
   private JTextField jTextLastName = new JTextField(10);

   private static Connection connection = null;

   public ConnectJDBCTest() {
       initLayout();
       initConnection();
   }

   private void initLayout() {

       defaultTableModel.addColumn("Id");
       defaultTableModel.addColumn("First Name");
       defaultTableModel.addColumn("Last Name");
       defaultTableModel.addColumn("Update item");


       jTable.addMouseListener(new MouseAdapter() {
           @Override
           public void mouseClicked(MouseEvent e) {
               int seletedRow = jTable.getSelectedRow();
               DefaultTableModel defaultTableModel = (DefaultTableModel) jTable.getModel();
               jTextFieldID.setText(defaultTableModel.getValueAt(seletedRow, 0).toString());
               jTextFirsName.setText(defaultTableModel.getValueAt(seletedRow, 1).toString());
               jTextLastName.setText(defaultTableModel.getValueAt(seletedRow, 2).toString());
           }
       });

       jTable.getColumn("Update item").setCellEditor(new UpdateItem());
       jTable.getColumn("Update item").setCellRenderer(new BotonRenderizado());

       final JPanel jPanel = new JPanel();
       jPanel.setLayout(new BorderLayout());
       jPanel.add(jScrollPane, BorderLayout.NORTH);

       final JPanel jPanelSur = new JPanel();
       jPanelSur.add(new JLabel("ID"));
       jPanelSur.add(jTextFieldID);
       jPanelSur.add(new JLabel("First Name"));
       jPanelSur.add(jTextFirsName);
       jPanelSur.add(new JLabel("Last Name"));
       jPanelSur.add(jTextLastName);

       jPanel.add(jPanelSur, BorderLayout.SOUTH);

       add(jPanel);

       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setLocationRelativeTo(null);
       pack();
       setVisible(true);
   }

   private void initConnection() {
       try {
           connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
           final Statement statement = connection.createStatement();
           final ResultSet resultSet = statement.executeQuery(SELECT);
           while (resultSet.next()) {
               id = resultSet.getLong("id");
               firstName = resultSet.getString("first_name");
               lastName = resultSet.getString("last_name");
               defaultTableModel.addRow(new Object[]{id, firstName, lastName});
           }
       } catch (SQLException e) {
           e.printStackTrace();
       }
   }

   private class UpdateItem extends AbstractCellEditor implements TableCellEditor {

       private JButton editor = new JButton();
       private Object value;
       private int fila;
       private JTable table;

       public UpdateItem() {

           updateItem();

       }

       private void updateItem() {
           editor.addActionListener(e -> {
               if (table != null) {
                   fireEditingStopped();
                   TableModel model = table.getModel();
                   if (model instanceof DefaultTableModel) {
                       try {
                           int getrow = table.getSelectedRow();
                           final Long id = Long.valueOf(jTextFieldID.getText());
                           final String firstName = jTextFirsName.getText();
                           final String lastName = jTextLastName.getText();


                           final PreparedStatement ps = connection.prepareStatement(UPDATE);
                           ps.setString(1, firstName);
                           ps.setString(2, lastName);
                           ps.setLong(3, id);
                           ps.executeUpdate();

                           //DbUtils
                           model.setValueAt(id, getrow, 0);
                           model.setValueAt(firstName, getrow, 1);
                           model.setValueAt(lastName, getrow, 2);

                           JOptionPane.showMessageDialog(null, "Updated");

                       } catch (SQLException ex) {
                           ex.printStackTrace();
                       }
                   }
               }
           });
       }

       @Override
       public boolean isCellEditable(EventObject e) {
           return true;
       }

       @Override
       public Object getCellEditorValue() {
           return value;
       }

       @Override
       public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
           this.table = table;
           this.fila = row;
           this.value = value;
           if (value != null) {
               editor.setText("");
           } else {
               editor.setText("update");
           }
           if (isSelected) {
               editor.setForeground(table.getSelectionForeground());
               editor.setBackground(table.getSelectionBackground());
           } else {
               editor.setForeground(table.getForeground());
               editor.setBackground(UIManager.getColor("Button.background"));
           }
           return editor;
       }
   }

   public static void main(String... blabla) {
       final String osType = System.getProperty("os.name");
       try {
           if (osType.contains("Win")) {
               UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
           } else if (osType.contains("Linux")) {
               UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
           }
       } catch (Exception ex) {
           //do nothing
       }
       new Thread(() -> {
           new ConnectJDBCTest();
       }).start();
   }
}


Selecciona primero un item, editalo , luego actualiza



rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen