Pagina 1 di 1

[JAVA] JTable

Inviato: lunedì 29 settembre 2008, 10:59
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?

Re: [JAVA] JTable

Inviato: lunedì 29 settembre 2008, 16:07
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);
	}
}

Re: [JAVA] JTable

Inviato: lunedì 29 settembre 2008, 16:23
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)

Re: [JAVA] JTable

Inviato: lunedì 29 settembre 2008, 16:33
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...

Re: [JAVA] JTable

Inviato: lunedì 29 settembre 2008, 16:47
da Arcovoltaico77
gh gh... tutti che sbattiamo la capoccia contro gli stessi oggetti (rotfl)

Re: [JAVA] JTable

Inviato: lunedì 29 settembre 2008, 16:55
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. :)

Re: [JAVA] JTable

Inviato: giovedì 2 ottobre 2008, 16:37
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.