Aggiornare cella JTable

di il
6 risposte

Aggiornare cella JTable

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

  • Re: Aggiornare cella JTable

    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.
  • Re: Aggiornare cella JTable

    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.
  • Re: Aggiornare cella JTable

    cicciomaz ha scritto:


    Ciao, ho seguito la strada del DefaultTableModel aggiungendo
    table.addKeyListener(new KeyAdapter() {
    KeyListener?? E che dovrebbe c'entrare in questo contesto?
  • Re: Aggiornare cella JTable

    Perchè quando immetto il valore nella cella 2 poi premo invio...

    No?
  • Re: Aggiornare cella JTable

    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.
  • Re: Aggiornare cella JTable

    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