|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2002
Città: Roma
Messaggi: 795
|
[JAVA] Colorare x caselle di una JTable
Supponiamo di avere una tabella 6x6
diciamo che voglio colorare di un colore diverso dal bianco la prima riga (tutte e 6 le caselle) e 2 caselle della seconda h0o provato ad utilizzare le funzioni di "range" della tabella (per righe e colonnne) combinandole e poi colorando ma premesso che sembra considerare solamente il range di righe e se ne frega di quello delle colonne, mi colora cmq la riga intera e spesso non tutte quelle che chiedo. dovrebbe essere una cretinata, tipo 3 righe di codice e sicuramente sbaglio in una stupidagine. qualcuno potrebbe dirmi come fare? grazie mille :°)
__________________
PC: Pentium dual core E5200 su ASUS P5K SEe/EPU, 2GB ram, Nvidia GeForce 9600 GSO, Hdd Western Digital 500Gb, ..... |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
che io sappia non è immediato, devi scrivere una tua classe che implmenta l'interfaccia TableCellRenderer (o più semplicemente che estende DefaultTableCellRenderer) e all'interno a seconda degli indici di riga e colonna che ti vengono passati chiamare setBackground con il colore desiderato come argomento.
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jun 2002
Città: Roma
Messaggi: 795
|
Ti ringrazio per la risposta,
ciò che volevo sapere, però, è: come dico quali singole tabelle colorare prima di lanciare la setBackground?
__________________
PC: Pentium dual core E5200 su ASUS P5K SEe/EPU, 2GB ram, Nvidia GeForce 9600 GSO, Hdd Western Digital 500Gb, ..... |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Apr 2000
Messaggi: 138
|
Quando istanzi la tabella devi settargli un cellrenderer (se non vuoi usare quello di default) e il gioco e' fatto.
ciao,
__________________
fgmac |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
ti faccio un esempio, il codice sottostante colora solo le celle alla prima riga. Nota che devi chiamare setCellRenderer per ogni colonna a cui vuoi che sia applicato il renderer custom (se per tutta la tabella fai un ciclo for) Codice:
table.getColumnModel().getColumn(0).setCellRenderer(new 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.green ); else cell.setBackground( Color.white ); return cell; }}); |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jun 2002
Città: Roma
Messaggi: 795
|
Ho capito, ringrazio davvero entrambi per l'aiuto
![]()
__________________
PC: Pentium dual core E5200 su ASUS P5K SEe/EPU, 2GB ram, Nvidia GeForce 9600 GSO, Hdd Western Digital 500Gb, ..... |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jun 2002
Città: Roma
Messaggi: 795
|
Quote:
cIAO, perdona l'ingnoranza ma sono le prime cose che faccio con java non ho ben capito il codice che inserisci dopo DefaultTableCellRender: ossia crei un nuovo metodo all'interno dell'altra invocazione? chi e come dovrebbe chiamarlo? ad ogni modo in soldoni attualmente ho creato nella mia classe questo metodo public void Colora (JTable tablle, DefaultTableCellRenderer value, int row, int column) { Component cell = value.getTableCellRendererComponent (tablle, new Object(), true, true, row, column); if(row==0) cell.setBackground( Color.green ); else cell.setBackground( Color.white ); }; lui viene invocato nel "main della classe " (che in realtà è il metodo run) in questo modo DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer(); (table.getColumn(table.getColumnName(3))).setCellRenderer(dtcr); this.Colora(table,dtcr,0,1); così però mi colora tutta la quarta colonna (quella con indice 0). come devo fare in modo lineare a colorare solo una cella? avevo trovato un corrispondente per le righe ma non esiste... ossia il get/set cellrender esiste solo per la classe TableColumn.... non esiste una TableRow da poterci intersecare? ossia esiste TableColumn e non row??? scusate ancora x il casino e l'inesperienza javica ![]()
__________________
PC: Pentium dual core E5200 su ASUS P5K SEe/EPU, 2GB ram, Nvidia GeForce 9600 GSO, Hdd Western Digital 500Gb, ..... |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
scusa ma ti ho postato un pezzo di codice, l'hai provato?
Il tuo metodo non va bene perchè la chiamata a setBackground viene fatta sul componente che è usato come renderer da tutte le celle, quindi quelle successive a quella che vuoi colorare hanno pure loro quello sfondo. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jun 2002
Città: Roma
Messaggi: 795
|
Si, l'ho provato e ti ringrazio (funziona!)
volevo solamente capire (x usi futuri) cosa significa quando nel codice fai table.getColumnModel().getColumn(0).setCellRenderer(new DefaultTableCellRenderer() { ossia invece di dargli un parametro DTCR e basta apri una graffa e definisci unn nuovo metodo. chi lo chiama? come? (mi va bene anke un linkino ad una documentazione in merito a questa struttura senza che sprechi troppo tempo, visto che già me ne hai concesso non poco ![]() non avendolo capito provavo a farlo in altro modo (e ti ringrazio per la spiegazione del non funzionamento)
__________________
PC: Pentium dual core E5200 su ASUS P5K SEe/EPU, 2GB ram, Nvidia GeForce 9600 GSO, Hdd Western Digital 500Gb, ..... |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
In pratica kingv non ha fatto altro che definire l'intera classe che vuole passare come CellRenderer "al volo" durante la creazione di un'istanza anonima, anzichè definirla a parte, crearne un'instanza e poi passarla al metodo setCellRenderer.
Era possibile anche definire la nuova classe per conto proprio (come classe interna, o come classe esterna previa importazione), crearne un'istanza e poi passare quella al metodo. Nota che la classe creata nel modo "veloce" non ha nome e non è referenziabile: d'altra parte, poichè il suo utilizzo è limitato e non andrà (probabilmente) nè estesa nè riutilizzata, va bene anche così... Voglio dire che si sarebbe potuto anche scrivere: Codice:
class MioCellRenderer 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.green ); else cell.setBackground( Color.white ); return cell; } } ... MioCellRenderer mcr = new MioCellRenderer(); table.getColumnModel().getColumn(0).setCellRenderer(mcr);
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jun 2002
Città: Roma
Messaggi: 795
|
ho capito... non lo sapevo!!
grazie 1000 ad entrambi!!!!
__________________
PC: Pentium dual core E5200 su ASUS P5K SEe/EPU, 2GB ram, Nvidia GeForce 9600 GSO, Hdd Western Digital 500Gb, ..... |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:55.