Ascoltatore JTable java

5 risposte [Ultimo contenuto]
Ritratto di qop
qop
(Newbie)
Offline
Newbie
Iscritto: 29/09/2012
Messaggi: 5

Ciao a tutti, vi contatto perchè ho bisogno di aiuto riguardo un ascoltatore per una JTable:

ho creato una tabella, adesso vorrei eseguire delle azioni ogni volta che l' utente edita una cella.
Ho provato a utilizzare questo

table.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {

/* codice da eseguire una volta editata la cella */

}
});

Questo ascoltatore però non va bene:
una volta che l'utente ha editato una cella e preme invio, all'invocazione del comando getValueAt esso mi ritorna il valore presente PRIMA della modifica dell'utente.

Es: se in una cella cè scritto "5", l' utente ci scrive "10", preme invio, l' ascoltatore si avvia, e getValueAt mi ritorna "5", io invece vorrei un ascoltatore che mi ritorni "10".

Grazie in anticipo per l' attenzione.

Ritratto di homeless
homeless
(Guru)
Offline
Guru
Iscritto: 21/10/2011
Messaggi: 1451

Fornisci il codice sorgente *completo* in modo da consentire a chi volesse desiderare aiutarti di poterlo fare.

Ritratto di qop
qop
(Newbie)
Offline
Newbie
Iscritto: 29/09/2012
Messaggi: 5

Mah il codice della creazione della tabella posso anche dartelo ma non credo ti sia di alcun aiuto, perchè io sto chiedendo quale ascoltatore serve per una Jtable nel caso io voglia eseguire azioni una volta che l'utente abbia finito di editare una cella, e che il comando getValueAt restituisca il valore appena inserito dall'utente e non quello presente precedentemente la modifica.

Il codice che ho scritto fino ad ora è irrilevante.

Ritratto di homeless
homeless
(Guru)
Offline
Guru
Iscritto: 21/10/2011
Messaggi: 1451

qop ha scritto:

il codice che ho scritto fino ad ora è irrilevante.


Avendo il codice completo dell'applicazione e/o un "proof of concept" già pronto, chi volesse aiutarti potrebbe studiare e verificare la soluzione da proporti prima di inviartela.

Ritratto di qop
qop
(Newbie)
Offline
Newbie
Iscritto: 29/09/2012
Messaggi: 5

questa è la classe che rappresenta la tabella:

 public TableInterface() {
 
        initComponents();
    }
 
    @SuppressWarnings("unchecked")
 
    private void initComponents() {
 
        jScrollPane1 = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();
        ButtonsPanel = new javax.swing.JPanel();
        saveButton = new javax.swing.JButton();
        searchButton = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        funBox = new javax.swing.JComboBox();
 
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
 
        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"1", null, null, null, null, null},
                {"2", null, null, null, null, null},
                {"3", null, null, null, null, null},
                {"4", null, null, null, null, null},
                {"5", null, null, null, null, null},
                {"6", null, null, null, null, null},
                {"7", null, null, null, null, null},
                {"8", null, null, null, null, null},
                {"9", null, null, null, null, null},
                {"10", null, null, null, null, null},
                {"11", null, null, null, null, null},
                {"12", null, null, null, null, null},
                {"13", null, null, null, null, null},
                {"14", null, null, null, null, null},
                {"15", null, null, null, null, null},
                {"16", null, null, null, null, null},
                {"17", null, null, null, null, null},
                {"18", null, null, null, null, null},
                {"19", null, null, null, null, null},
                {"20", null, null, null, null, null}
            },
            new String [] {
                "", "A", "B", "C", "D", "E"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, true, true, true, true, true
            };
 
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        table.getModel().addTableModelListener(new TableModelListener() {
            public void tableChanged(TableModelEvent e) {
 
 
              /*  QUÀ RICHIAMO DEL CODICE PRESENTE IN ALTRE CLASSI ATTO A MANIPOLARE LA TABELLA IN BASE ALL'INSERIMENTO DELL'UTENTE */
            }
        });
        jScrollPane1.setViewportView(table);
        table.setAutoCreateRowSorter(true);
        table.getColumnModel().getColumn(0).setMinWidth(0);
        table.getColumnModel().getColumn(0).setPreferredWidth(5);
 
        saveButton.setText("Save");
 
        searchButton.setText("Search");
        searchButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchButtonActionPerformed(evt);
            }
        });
 
        javax.swing.GroupLayout ButtonsPanelLayout = new javax.swing.GroupLayout(ButtonsPanel);
        ButtonsPanel.setLayout(ButtonsPanelLayout);
        ButtonsPanelLayout.setHorizontalGroup(
            ButtonsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(ButtonsPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(saveButton, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(searchButton, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        ButtonsPanelLayout.setVerticalGroup(
            ButtonsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, ButtonsPanelLayout.createSequentialGroup()
                .addGroup(ButtonsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(saveButton, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(searchButton, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(27, Short.MAX_VALUE))
        );
 
        jLabel1.setText("Funzione:");
 
        funBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Disabilitata", "Somma", "Sottrazione", "Moltiplicazione", "Divisione" }));
        funBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                funBoxActionPerformed(evt);
            }
        });
 
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(ButtonsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(76, 76, 76)
                        .addComponent(jLabel1)
                        .addGap(18, 18, 18)
                        .addComponent(funBox, javax.swing.GroupLayout.PREFERRED_SIZE, 272, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 608, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(1, 1, 1)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(funBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 342, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(36, 36, 36)
                .addComponent(ButtonsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
 
        pack();
    }                     
 
    private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
 
    }                                            

Ritratto di homeless
homeless
(Guru)
Offline
Guru
Iscritto: 21/10/2011
Messaggi: 1451

Hai fornito codice non pronto alla verifica e questo mi ha richiesto maggior tempo ed impegno per poterti aiutare: per cortesia, se possibile, la prossima volta fornisci il codice sorgente completo.

Ho riscritto parte del codice sorgente che non hai fornito (che si collegasse a quello che hai indicato nel messaggio precedente) per poter effettuare i test del caso ed ho modificato anche quello che hai inviato perché si integrasse con il precedente.

Citazione:

una volta che l'utente ha editato una cella e preme invio, all'invocazione del comando getValueAt esso mi ritorna il valore presente PRIMA della modifica dell'utente. Es: se in una cella cè scritto "5", l' utente ci scrive "10", preme invio, l' ascoltatore si avvia, e getValueAt mi ritorna "5", io invece vorrei un ascoltatore che mi ritorni "10".

Nel codice sorgente completo che riporto in allegato, ho aggiunto al JFrame che contiene la tabella un ulteriore pulsante (chiamato "Cell Value") che visualizza il contenuto della cella della tabella che in quel momento ha il focus. Premendo questo pulsante, si apre una finestra modale che visualizza la riga e colonna della cella ed il valore in essa contenuto. Nell'implementazione che ti ho inviato il valore è riportato correttamente anche dopo averlo modificato. Poiché non hai fornito il codice sorgente che ti malfunziona, non posso sapere dove - eventualmente - hai commesso un errore.

Il codice è testato con JDK 1.6.

Per cortesia, dai riscontro.

Grazie.

=======================================

File MainTableTest.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package TableTest;
 
/**
 *
 * @author homeless
 */
public class MainTableTest extends TableInterface {
 
    private static TableInterface tableInterface  = new TableInterface();
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
 
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                tableInterface.initComponents();
            }
        });
    }
}

File TableInterface.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package TableTest;
 
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
 
 
/**
 *
 * @author homeless
 */
public class TableInterface {
    private JFrame jFrame;
    private JScrollPane jScrollPane1;
    private JTable table;
    private JPanel ButtonsPanel;
    private JButton saveButton;
    private JButton searchButton;
    private JButton getValueAtButton;
 
    private JLabel jLabel1;
    private JComboBox funBox;
 
    @SuppressWarnings("unchecked")
 
    public void TableInterface () {
        // do nothing
    }
 
    public void initComponents() {
 
        jFrame = new JFrame("FrameDemo");
        jScrollPane1 = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();
        ButtonsPanel = new javax.swing.JPanel();
        saveButton = new javax.swing.JButton();
        searchButton = new javax.swing.JButton();
        getValueAtButton = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        funBox = new javax.swing.JComboBox();
 
        jFrame.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
 
        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"1", null, null, null, null, null},
                {"2", null, null, null, null, null},
                {"3", null, null, null, null, null},
                {"4", null, null, null, null, null},
                {"5", null, null, null, null, null},
                {"6", null, null, null, null, null},
                {"7", null, null, null, null, null},
                {"8", null, null, null, null, null},
                {"9", null, null, null, null, null},
                {"10", null, null, null, null, null},
                {"11", null, null, null, null, null},
                {"12", null, null, null, null, null},
                {"13", null, null, null, null, null},
                {"14", null, null, null, null, null},
                {"15", null, null, null, null, null},
                {"16", null, null, null, null, null},
                {"17", null, null, null, null, null},
                {"18", null, null, null, null, null},
                {"19", null, null, null, null, null},
                {"20", null, null, null, null, null}
            },
            new String [] {
                "", "A", "B", "C", "D", "E"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, true, true, true, true, true
            };
 
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
 
        table.getModel().addTableModelListener(new TableModelListener() {
            public void tableChanged(TableModelEvent e) {
 
 
              /*  QUÀ RICHIAMO DEL CODICE PRESENTE IN ALTRE CLASSI ATTO A MANIPOLARE LA TABELLA IN BASE ALL'INSERIMENTO DELL'UTENTE */
            }
        });
 
        jScrollPane1.setViewportView(table);
        table.setAutoCreateRowSorter(true);
        table.getColumnModel().getColumn(0).setMinWidth(0);
        table.getColumnModel().getColumn(0).setPreferredWidth(5);
 
        saveButton.setText("Save");
 
        searchButton.setText("Search");
 
        getValueAtButton.setText("Cell value");
 
        searchButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchButtonActionPerformed(evt);
            }
        });
 
        getValueAtButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                getValueAtButtonActionPerformed(evt);
            }
 
            private void getValueAtButtonActionPerformed(ActionEvent evt) {
                int r = table.getSelectedRow();
                int c = table.getSelectedColumn();
                String valueAt = (String) table.getValueAt(r, c);
 
                JOptionPane.showMessageDialog(jFrame,
                    valueAt ,
                    "table.getValueAt(" + r + "," + c + ")",
                    JOptionPane.PLAIN_MESSAGE);
 
                // throw new UnsupportedOperationException("Not yet implemented");
            }
        });
 
        javax.swing.GroupLayout ButtonsPanelLayout = new javax.swing.GroupLayout(ButtonsPanel);
 
        ButtonsPanel.setLayout(ButtonsPanelLayout);
        ButtonsPanelLayout.setHorizontalGroup(
            ButtonsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(ButtonsPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(saveButton, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(searchButton, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(getValueAtButton, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
 
        ButtonsPanelLayout.setVerticalGroup(
            ButtonsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, ButtonsPanelLayout.createSequentialGroup()
                .addGroup(ButtonsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(saveButton, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(searchButton, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(getValueAtButton, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(27, Short.MAX_VALUE))
        );
 
        jLabel1.setText("Funzione:");
 
        funBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Disabilitata", "Somma", "Sottrazione", "Moltiplicazione", "Divisione" }));
 
        funBox.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                funBoxActionPerformed(evt);
            }
 
            private void funBoxActionPerformed(ActionEvent evt) {
                throw new UnsupportedOperationException("Not yet implemented");
            }
        });
 
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(jFrame.getContentPane());
 
        jFrame.getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(ButtonsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(76, 76, 76)
                        .addComponent(jLabel1)
                        .addGap(18, 18, 18)
                        .addComponent(funBox, javax.swing.GroupLayout.PREFERRED_SIZE, 272, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 608, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
 
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(1, 1, 1)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(funBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 342, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(36, 36, 36)
                .addComponent(ButtonsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
 
        jFrame.pack();
 
        jFrame.setVisible(true);
    }                     
 
    private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
 
    }  
}