Aggiornare cella JTable

di Anonimizzato20984 il
6 risposte
Salve vorrei creare una tabella con tre colonne dove nella prima cella ho un valore da me prestabilito nella seconda cella si deve immettere un valore sempre diverso e la terza cella deve visualizzare il risultato della somma.

Potete darmi dei suggerimenti su quali eventi usare per fare aggiornare la terza cella?

Grazie. Ciao.

6 Risposte

  • cicciomaz ha scritto:


    Potete darmi dei suggerimenti su quali eventi usare per fare aggiornare la terza cella?
    Se non vuoi arrivare a personalizzare un table model, una soluzione è quella di implementare TableModelListener per ricevere le notifiche dei cambiamenti dal table model. Questa soluzione però è critica per almeno due motivi: innanzitutto l'oggetto evento TableModelEvent è in grado di esprimere svariati tipi di cambiamenti (es. è stata aggiunta una riga, è stata rimossa una riga, la cella r,c è stata aggiornata, ecc...) quindi dovresti comprendere tutti questi tipi di cambiamenti e saper agire di conseguenza. Inoltre se dall'evento che ricevi arrivi a dedurre che devi (ri)applicare quella somma perché "qualcosa" è cambiato nelle prime due colonne, andrai ovviamente a fare un setValueAt nel model sulla terza colonna. Ma questo set a sua volta scatenerà un ulteriore TableModelEvent, quindi bisogna gestire l'evento in modo accorto da non far andare in loop la gestione.

    Se invece puoi scegliere la soluzione a livello di table model, allora dovresti personalizzare il comportamento appunto di un table model. Ora: la scelta è solo tra implementare un table model da "quasi" zero (tipicamente si estende AbstractTableModel per questo) oppure se ti basta personalizzare leggermente uno esistente come il DefaultTableModel. L'approccio varia a seconda di questa scelta.
  • Ciao, ho seguito la strada del DefaultTableModel aggiungendo
    
    table.addKeyListener(new KeyAdapter() {
    			@Override
    			public void keyPressed(KeyEvent e) {
    				if (e.getKeyCode() == KeyEvent.VK_ENTER) {
    					....
    					....
    				}
    			}
    		});
    
    Solo che per fare apportare le modifiche devo pigiare 2 volte sul tasto Enter. C'è un modo per farlo pigiando 1 sola volta su Enter?

    Grazie. Ciao.
  • cicciomaz ha scritto:


    Ciao, ho seguito la strada del DefaultTableModel aggiungendo
    table.addKeyListener(new KeyAdapter() {
    KeyListener?? E che dovrebbe c'entrare in questo contesto?
  • Perchè quando immetto il valore nella cella 2 poi premo invio...

    No?
  • cicciomaz ha scritto:


    Perchè quando immetto il valore nella cella 2 poi premo invio...
    Ma non serve comunque KeyListener! Quando l'utente conferma l'input (con invio) viene già fatto in automatico il setValueAt sul model che scatena a sua volta l'evento di cambiamento.
    A te basta operare o con un tuo TableModelListener (ma come ho detto è più critico) oppure andando a personalizzare il table model.
  • Ok. Alla fine ho fatto così e funziona
    
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.border.EmptyBorder;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.DefaultTableModel;
    
    public class prove extends JFrame {
    
    	private JPanel contentPane;
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					prove frame = new prove();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the frame.
    	 */
    	public prove() {
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setBounds(100, 100, 736, 300);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		contentPane.setLayout(new BorderLayout(0, 0));
    		setContentPane(contentPane);
    		
    		JTable table = new JTable();
    		
    		table.setModel(new DefaultTableModel(
    			new Object[][] {
    				{new Double(1.82), "", ""},
    			},
    			new String[] {
    				"K fact", "Val", "Tot"
    			}
    		));
    		
    	    table.getModel().addTableModelListener(new TableModelListener() {
    	    	public void tableChanged(TableModelEvent e) {
    	    		int col = e.getColumn();
    	    		int row = e.getFirstRow();
    	    		if (col == 1) {
    	    			
    					double val = Double.parseDouble((String) table.getValueAt(row, 1));
    				    double tot =  (double) table.getValueAt(row, 0) * val;
    				    table.setValueAt(tot, row, 2);
    	    		}
    	    	}
    
    			
    	    });
    	  
    		contentPane.add(table, BorderLayout.CENTER);
    	}
    
    }
    
    E' giusto???

    Grazie. Ciao.
Devi accedere o registrarti per scrivere nel forum
6 risposte