PDA

View Full Version : [JAVA] problema di visualizzazione con JTable


clyrix
20-02-2008, 20:24
ciao a tutti!
dopo aver cercato in lungo e in largo una soluzione al mio problema, mi rivolgo a voi, sperando di mettere fine alle mie pene...

Nella mia interfaccia ho una JTable.
per poterne colorare determinate celle, ho inserito in un array il numero di riga della cella da colorare, dunque gli indici dell'array corrispondono alle colonne e il contenuto corrisponde all'unica cella da colorare in ciascuna colonna.

Sono riuscita a farlo definendo un Renderer.
il problema è cha da un certo punto in poi si incanta: vale a dire che il renderer delle ultime colonne resta uguale per tutte, indipendentemente dai valori contenuti nell'array.
inoltre se sposto la scroll bar del JScrollPane contenente la tabella, i colori delle ultime colonne vengono semicancellati...
con gli updateUI non ho risolto nulla.... non so che pesci prendere.

Questa è la ridefinizione del Renderer. vittime è il nome dell'array.

public class MyTableRenderer 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);

for (int i=0; i<npagine; i++)
{
if (column==i)
cell.setBackground(row==vittime[i] ? Color.cyan : Color.white);

}
return cell;
}
}


lo uso qui:

mtr = new MyTableRenderer();

for (int c=0;c<vittime.length;c++)
{
if (vittime[c]!=-1)
mvtab.getColumnModel().getColumn(c).setCellRenderer(mtr);

}

se avete un consiglio, qualunque consiglio, ditemi pure! :D

TuX2K6
22-02-2008, 08:50
Ti posto il mio renderer, l'unica cosa che ho fatto è stato settarlo alla tabella

private class Renderer implements TableCellRenderer{

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
//table.getColumnModel().getColumn(0).setWidth(0);
JLabel label = new JLabel();
if(value!=null)
label.setText(value.toString());

if(isSelected){
label.setOpaque(true);
label.setBackground(Color.ORANGE);
}else
if((row % 2)==0){
label.setOpaque(true);
label.setBackground(new Color(166,202,240));
}else
label.setBackground(Color.WHITE);


return label;
}

}

clyrix
22-02-2008, 11:46
Ciao Tux, ti ringrazio, iniziavo a perdere le speranze!

ispirandomi al tuo ho modificato nel modo seguente:

public class MyTableRenderer implements TableCellRenderer {

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);
JLabel label = new JLabel();
label.setText(value.toString());

for (int i=0; i<npagine; i++)
{

if (column==i) { //per ogni colonna
if (row==vittime[i]) { //se la riga è quella indicata nel vettore colora d'azzurro
label.setOpaque(true);
label.setBackground( Color.cyan );
}
else { label.setOpaque(true);
label.setBackground( Color.white );
}
}
}
return label;
}
}

...ma il comportamento è lo stesso! :muro:
io per necessità devo colorare lo sfondo di alcune righe in alcune colonne, le righe da colorare sono nel vettore "vittime".
Per alcune sequenze nel vettore vittime, funziona tutto bene. per altre no :confused:
che sia un problema di concorrenza? non saprei come gestire delle thread, vorrei evitarlo :(

TuX2K6
22-02-2008, 14:21
Ho fatto velocemente una prova, purtroppo senza spulciare troppo il tuo codice, usando un Set<Integer> e mi sembra funzionare :)
Praticamente controllo se il n° di riga è contenuto nel Set ed in quel caso cambio il colore

public class MyTableRenderer implements TableCellRenderer {

Set<Integer> selected;

public MyTableRenderer(Set<Integer> selected) {
this.selected = selected;
}

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
JLabel label = new JLabel();
if (value != null)
label.setText(value.toString());

if (selected.contains(row)) {
label.setOpaque(true);
label.setBackground(Color.ORANGE);
} else
label.setBackground(Color.WHITE);

return label;
}

}