[JAVA] JTable

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
ing_magnus
Prode Principiante
Messaggi: 48
Iscrizione: domenica 2 dicembre 2007, 12:30
Contatti:

[JAVA] JTable

Messaggio da ing_magnus »

esiste una classe capace di farmi gestire le celle di una JTable in maniera "naturale"?

Sono una cosa antipaticissima.

Ho cercato di creare una funzione di grado di colorare delle celle a piacimento ( su una tabella già creata ), ma niente da fare. La gestione è davvero troppo ingarbugliata e sembra funzionare in modo anomalo.

Questo è il codice della funzione che dovrebbe colorare le celle ( i valori negli array servono ad individuare le celle da colorare ):

Codice: Seleziona tutto

public void coloraCella(final int righe[],final int colonne[]){ 
            for (int i=0;i<righe.length;i++){ 
                   final int indice=i; 
                   tabella.getColumnModel().getColumn(colonne[i]). 
                    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); 
                                System.out.println(row + " " + column); 
                                 
                                if(row==righe[indice] && column==colonne[indice]){ 
                                    cell.setBackground( Color.green ); 
                                    System.out.println("?"); 
                                }else{ 
                                    if (!cell.getBackground().toString().equals("java.awt.Color[r=0,g=255,b=0]")){ 
                                        cell.setBackground( Color.white ); 
                                        System.out.println("!"); 
                                    } 
                                } 

                                return cell; 
                                } 
                         } 
                    ); 
            } 
    }
Dove sbaglio?

Richiamando la funzione nel modo seguente:

int t[]={0,1};
int y[]={2,2};
tabellaConti.coloraCella(t,y);

la cella relativa alla prima riga rimane bianca ( e la cella relativa alla seconda riga viene colorata )

Invece in questo modo:

int t[]={0,1};
int y[]={2,3};
tabellaConti.coloraCella(t,y);

La funzione lavora bene ( le due celle vengono colorate correttamente ).

Avete consigli?
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [JAVA] JTable

Messaggio da Zoff »

Che tipo di TableModel hai usato?
Potrebbero esserci metodi piu' semplici...

EDIT: Ecco un Renderer personalizzato che dovrebbe fare quello che hai chiesto...

Codice: Seleziona tutto

import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.util.Hashtable;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


public class MyTableCellRenderer extends DefaultTableCellRenderer {
	protected Hashtable<Point, Color> settings;
	
	public MyTableCellRenderer() {
		super();
		settings = new Hashtable<Point, Color>();
	}
	/**
	 * addSetting(int row, int col, Color c)
	 * Registra un impostazione di rendering per la cella
	 * @param row Riga della cella
	 * @param col Colonan della cella
	 * @param c Colore da utilizzare
	 * @throws Exception Impostazione già presente
	 */
	public void addSetting(int row, int col, Color c)throws Exception{
		Point cLoc = new Point(row,col);
		if(settings.contains(cLoc)) throw new Exception("Impostazione già presente.");
		settings.put(cLoc, c);
	}
	/**
	 *  removeSetting(int row, int col)
	 *  Rimuove l'impostazione di rendering registrata per la cella
	 * @param row Riga delal cella
	 * @param col Colonna della cella
	 * @throws Exception 
	 */
	public void removeSetting(int row, int col) throws Exception{
		Point cLoc = new Point(row,col);
		if(!settings.contains(cLoc)) throw new Exception("Impostazione non presente");
		settings.remove(cLoc);
	}
	
	@Override
	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);
		//Inizio personalizzazione
		Point cellLocation = new Point(row,column);
		if(settings.containsKey(cellLocation)){//Controllo se c'e' un impostazione per la cella
			//Applico l'impostazione
			cell.setBackground(settings.get(cellLocation));
		}
		//Fine personalizzazione
		return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
	}
}
Ultima modifica di Zoff il lunedì 29 settembre 2008, 16:32, modificato 1 volta in totale.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
Arcovoltaico77
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1082
Iscrizione: giovedì 26 luglio 2007, 9:52

Re: [JAVA] JTable

Messaggio da Arcovoltaico77 »

eeh, che le jtable siano rognose è fuori di dubbio, IMO  >:(
è uno di quegli oggetti dei quali non capirò mai la logica con cui sono stati creati...

Ti allego un paio di classi (mie) che ho usato in un mio progetto, per il problema inverso : far sembrare che tutta la riga sia selezionata, quando selezioni una casella.

Magari può esserti utile come spunto  (b2b)
Allegati
NewTableModel.java.txt
(1.03 KiB) Scaricato 44 volte
NewTableCellRenderer.java.txt
(1.87 KiB) Scaricato 49 volte
" Usare Linux é come mangiare dalla suocera, mangi bene e non spendi nulla! "
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [JAVA] JTable

Messaggio da Zoff »

Arcovoltaico77 ha scritto: eeh, che le jtable siano rognose è fuori di dubbio, IMO  >:(
è uno di quegli oggetti dei quali non capirò mai la logica con cui sono stati creati...

Ti allego un paio di classi (mie) che ho usato in un mio progetto, per il problema inverso : far sembrare che tutta la riga sia selezionata, quando selezioni una casella.

Magari può esserti utile come spunto  (b2b)

eh eh... Mi hai anticipato l'edit...
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
Arcovoltaico77
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1082
Iscrizione: giovedì 26 luglio 2007, 9:52

Re: [JAVA] JTable

Messaggio da Arcovoltaico77 »

gh gh... tutti che sbattiamo la capoccia contro gli stessi oggetti (rotfl)
" Usare Linux é come mangiare dalla suocera, mangi bene e non spendi nulla! "
Avatar utente
ing_magnus
Prode Principiante
Messaggi: 48
Iscrizione: domenica 2 dicembre 2007, 12:30
Contatti:

Re: [JAVA] JTable

Messaggio da ing_magnus »

Zoff ha scritto: Che tipo di TableModel hai usato?
Potrebbero esserci metodi piu' semplici...

EDIT: Ecco un Renderer personalizzato che dovrebbe fare quello che hai chiesto...

Codice: Seleziona tutto

import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.util.Hashtable;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


public class MyTableCellRenderer extends DefaultTableCellRenderer {
	protected Hashtable<Point, Color> settings;
	
	public MyTableCellRenderer() {
		super();
		settings = new Hashtable<Point, Color>();
	}
	/**
	 * addSetting(int row, int col, Color c)
	 * Registra un impostazione di rendering per la cella
	 * @param row Riga della cella
	 * @param col Colonan della cella
	 * @param c Colore da utilizzare
	 * @throws Exception Impostazione già presente
	 */
	public void addSetting(int row, int col, Color c)throws Exception{
		Point cLoc = new Point(row,col);
		if(settings.contains(cLoc)) throw new Exception("Impostazione già presente.");
		settings.put(cLoc, c);
	}
	/**
	 *  removeSetting(int row, int col)
	 *  Rimuove l'impostazione di rendering registrata per la cella
	 * @param row Riga delal cella
	 * @param col Colonna della cella
	 * @throws Exception 
	 */
	public void removeSetting(int row, int col) throws Exception{
		Point cLoc = new Point(row,col);
		if(!settings.contains(cLoc)) throw new Exception("Impostazione non presente");
		settings.remove(cLoc);
	}
	
	@Override
	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);
		//Inizio personalizzazione
		Point cellLocation = new Point(row,column);
		if(settings.containsKey(cellLocation)){//Controllo se c'e' un impostazione per la cella
			//Applico l'impostazione
			cell.setBackground(settings.get(cellLocation));
		}
		//Fine personalizzazione
		return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
	}
}
Sembra molto interessante! Grazie, appena sono a casa lo provo senza dubbio. :)
Avatar utente
ing_magnus
Prode Principiante
Messaggi: 48
Iscrizione: domenica 2 dicembre 2007, 12:30
Contatti:

Re: [JAVA] JTable

Messaggio da ing_magnus »

Ho provato ad usare la classe in questo modo:

MyTableCellRenderer mcr = new MyTableCellRenderer();
miaTabella.getColumn(0).setCellRenderer(mcr);

Ma esiste un modo per utilizzare la classe su tutta la tabella? Sembra che il renderer sia settabile solo su una colonna in particolare.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti