Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Celle editabili al click sul bottone

    Io ho un DefaultTableModel su cui ho fatto l'override di un solo metodo:
    codice:
    class modelSelect extends DefaultTableModel {
    			public modelSelect (Object[][] data, Object[] colonne) {
    				   super(data, colonne);
    			}
    	
    	    public boolean isCellEditable(int row, int col) {
    	    	return false;
    	    	}
    
    	 }
    In questa tabella sono (ovviamente) contenuti dei dati, io vorrei che al click su di un ipotetico bottone "modifica" la riga selezionata divenisse editabile. E' possibile? Se non è chiedere troppo potrei avere un piccolo esempio di codice?

    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Celle editabili al click sul bottone

    Originariamente inviato da MarcoJava
    io vorrei che al click su di un ipotetico bottone "modifica" la riga selezionata divenisse editabile. E' possibile?
    Sì, è possibile. Chiaramente non devi più far ritornare sempre e solo 'false' ma anche 'true' se e solo se è quella riga che vuoi impostare come editabile.
    E questo vuol dire che nel tuo model ci deve essere una informazione di "stato" che indica se e quale riga deve essere editable per cui isCellEditable deve ritornare true.

    Basta una banale variabile di istanza e un metodo setter per settare la riga (e un altro magari per comodità per resettare):

    codice:
    class SingleEditableRowModel extends DefaultTableModel {
        private int editableRow = -1;
    
        public SingleEditableRowModel(Object[][] data, Object[] colonne) {
            super(data, colonne);
        }
    
        public boolean isCellEditable(int row, int col) {
            return row == editableRow;
        }
    
        public void setEditableRow(int editableRow) {
            this.editableRow = editableRow;
        }
    
        public void resetEditable() {
            editableRow = -1;
        }
    }
    Da qualche, quando vuoi, fai:

    tuoModel.setEditableRow(riga);

    e quindi potrai editare la riga. Tutto qui, non è difficile, vero?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie per la tua solita puntualità e precisione!

    Funziona tutto perfettamente c'è solo una fastidioso problemino "grafico" che si presenta nel momento in cui vado a richiamare la funzione resetEditable(); mi spiego meglio:

    Navigando tra la tabella seleziono la riga da modificare --> clicco sul pulsante "modifica" e la riga diventa editabile (graficamente non accade nulla la riga rimane selezionata (colorata di blu) mentre io vorrei che apparisse il cursore su una qualsiasi cella della riga selezionata) clicco su una qualsiasi cella della riga in questione --> modifico il contenuto --> clicco sul bottone che mi richiama la funzione resetEditable() e la tabella ritorna NON editabile, il problema è che sull'ultima cella che ho modificato rimane il cursore attivo e fintanto che non seleziono un altro oggetto del pannello quella cella rimane editabile anche dopo la chiamata della funzione resetEditable(). Come posso fare??

    Spero di essermi spiegato
    Grazie Mille

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da MarcoJava
    graficamente non accade nulla la riga rimane selezionata (colorata di blu) mentre io vorrei che apparisse il cursore su una qualsiasi cella della riga selezionata
    Beh, questa è un'altra questione .... non centra più il model. Dopo che hai invocato setEditableRow(riga), per quella riga il model si limita solo ad "esporre" un true da isCellEditable().

    Vedi editCellAt() di JTable e nota bene, se lo provi, che non si comporta esattamente come se facessi doppio click sulla cella da editare.

    Originariamente inviato da MarcoJava
    clicco sul bottone che mi richiama la funzione resetEditable() e la tabella ritorna NON editabile, il problema è che sull'ultima cella che ho modificato rimane il cursore attivo e fintanto che non seleziono un altro oggetto del pannello quella cella rimane editabile anche dopo la chiamata della funzione resetEditable().
    Anche questo non centra più con il model.
    Oltre ad invocare resetEditable() fai:
    - prendi la riga/colonna che è attualmente in edit con getEditingRow()/getEditingColumn() di JTable.
    - prendi il TableCellEditor con getCellEditor() di JTable (passando la riga/colonna in editing)
    - sul editor invochi stopCellEditing()

    E così si "stoppa" la editazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Grazie infinite non ho parole... tu lo conosci come l'ave maria il Java, vorrei averti come insegnante privato!

    In ogni caso, per quanto riguarda il secondo punto va benissimo funziona perfettamente (mi riferisco allo stopCellEditing()). Per quanto concerne la mia prima domanda vorrei fare in modo che, invece di comparire il cursore, al momento in cui seleziono la riga e premo il pulsante "modifica" nessun altra riga divenisse selezionabile salvo quella selezionata prima della pressione su tale pulsante;

    Ho provato sia a fare un override di un ipotetico metodo isCellSelected() e con getSelectionInterval() ma nessuno dei due a funzionato...

    come posso fare?

    Grazie mille

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da MarcoJava
    vorrei fare in modo che, invece di comparire il cursore, al momento in cui seleziono la riga e premo il pulsante "modifica" nessun altra riga divenisse selezionabile salvo quella selezionata prima della pressione su tale pulsante
    Rendere delle righe non selezionabili credo che sia più tosto. La gestione della selezione non è fatta direttamente da JTable ma è affidata a un ListSelectionModel (la implementazione di default è DefaultListSelectionModel). Non ci ho mai provato ma estendendo DefaultListSelectionModel e facendo i dovuti override (un po', concettualmente, come l'esempio del model che ho fatto) credo che si possa fare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ok se gia mi dici tu che è tosto non ci metto nemmeno le mani anche perchè mi è venuta un altra idea: colorare la riga che ho selezionato per la modifica (non so ad esempio gialla) è laborioso? Posso usare semplicemente un metodo o devo estendere chissà quale classe?

    Potrei avere un piccolo esempio (se hai tempo ed il codice non è troppo lungo)?

    Grazie mille

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da MarcoJava
    colorare la riga che ho selezionato per la modifica (non so ad esempio gialla) è laborioso? Posso usare semplicemente un metodo o devo estendere chissà quale classe?
    No non basta invocare un metodo e via .... è più complesso perché si deve avere a che fare con i "renderer".

    Se non l'hai già fatto, leggi il tutorial della Sun sulle tabelle.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Mi hanno gia reindirizzato diverse volta a quel tutorial ma purtroppo non capisco molto di inglese... ho surfato a fondo su google ma non sono riuscito a trovare un pezzo di codice valido e comprensibile... l'unica cosa che ho capito è che mi devo creare una classe che estenda (almeno credo) il DefaultTableCellRender() ma non ci stò raccapezzando molto..
    In caso riesca a trovare maggiori info mi rifarò sentire!!

    Grazie Ancora

  10. #10
    Esempio: Ho cercato di mio pugno di scrivere uno stralcio di codice raccapezzato qua e la (una parte dal tutorial e un altra parte da alcuni forum) e mi sono accorto che in parte ha funzionato e in parte ha lasciato spazio a diversi dubbi... lo posto:
    codice:
    class myRender extends DefaultTableCellRenderer {
    			public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    				
    				Component cell = super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);
    				if(row==0) cell.setBackground(Color.red);
    				else
    				cell.setBackground(Color.green );
    				return cell;
    			}
    		}
    poi per far si che la tabella abbia come render questa classe:
    codice:
    mr = new myRender();
    table.getColumnModel().getColumn(0).setCellRenderer(mr);
    Il risultato che ottengo è di avere la prima cella della prima colonna colorata di rosso le altre celle (sempre della prima colonna) colorate di verde
    Ora avrei qualche domanda:
    1) Perchè posso assegnare il render SOLO alla colonna?? non c'è un getRowModel() o un getRowRender()??
    2) l'unico modo per richiamare il metodo di quella classe (che mi colora le celle) è scrivere table.getColumnModel().getColumn(0).setCellRendere r(mr);??
    3) Non posso assegnare semplicemente il render alla tabella facendo table.setCellRender(myRender) e poi richiamare metodi specifici di quella classe che mi colorino le celle allo scatenarsi di detrminati eventi??

    Grazie Mille

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.