RowSorter, righe colorate e checkbox

di il
5 risposte

RowSorter, righe colorate e checkbox

Ciao,
Mi sono costruito una JTable che contiene dei dati che vengono refreshati direttamente da DB on demand.
Questa tabella contiene dei risultati di schedulazioni ("success - no success") ed altri informazioni di contorno.
Tutti i no success sono colorati in arancione.
Come ultima colonna , ho un checkbox ("Ignore") che ignora il risultato della schedulazione e fa ridiventare la riga bianca.
A questa table ho applicato un rowsorter cosi da poter lavorare direttamente sull'ordinamento della tabella.
Ho applicato il renderer sottostante inoltre ho dovuto applicare il

int modelRow = table.getRowSorter().convertRowIndexToModel(row);
altrimenti le colorazioni sarebbero state falsate.

Il tutto funziona, ma appena applico il rowsorter applicato a qualunque colonna, il checkbox ignore non svolge più il suo compito e se tolgo il check non sbianchetta più la riga.

Cos'è che sbaglio?
Posto il renderer che può aiutarvi.


public class PanelRender extends DefaultTableCellRenderer {
	public PanelRender(){
		super();
		setOpaque(true);
	}

	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		int modelRow = table.getRowSorter().convertRowIndexToModel(row);		
		Boolean b=(boolean)table.getModel().getValueAt(row, 6);
		if(!b) {	       
	        int columnindex = 5;
	        String content = (String) table.getModel().getValueAt(modelRow, columnindex);
			if(content.equalsIgnoreCase("no success")) {
				this.setBackground(Color.ORANGE);
			}
			else {
				this.setBackground(Color.WHITE);
			}
		}
		else
			this.setBackground(Color.WHITE);
	
		return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
	
    }
    	
}


Grazie a chiunque possa suggerirmi un metodo per superare questo problema.

5 Risposte

  • Re: RowSorter, righe colorate e checkbox

    Ciao, riesci a postare un codice di esempio con qualche dato in cui riproduci il problema?

    Ho fatto qualche prova con il codice che si trova sul tutorial di JTable, e applicando il tuo Renderer si nota che quando selezioni/deselezioni un checkbox il renderer non viene chiamato, ma quando ti sposti su un'altra riga la colorazione viene applicata correttamente.

    Ma senza un codice completo ho paura che si possa solo cercare di indovinare, a me il tuo codice pare corretto.
  • Re: RowSorter, righe colorate e checkbox

    Ho ridotto il codice che rimpie la tabella ma le cose importanti sono riportate
    
    	public void buildTableModel(java.sql.ResultSet rs) throws java.sql.SQLException {
    	    int index=0;
    	    java.sql.ResultSetMetaData metaData = rs.getMetaData();
    	    Vector<String> columnNames = new Vector<String>();
    	    int columnCount = metaData.getColumnCount();
    	    for (int column = 1; column <= columnCount; column++) {
    	    	columnNames.add(tableHeaders1[column].toString());
    	    }    
    	    Vector<Vector<Object>> data = new Vector<Vector<Object>>();
    	    while (rs.next()) {
    	        Vector<Object> vector = new Vector<Object>();
    	        for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
    	        	if(columnIndex==5)
    	        		vector.add(rs.getString(columnIndex)); //me lo gestiva come blob e la tabella non lo leggeva correttamente 
                                                           //ho risolto nella maniera scritta precedentemente
    	        	else
    	        		vector.add(rs.getObject(columnIndex));
    	        }
    	        
    	        data.add(vector);
    	        index++;
    	    }
    	    tableModel.setDataVector(data, columnNames);	    
    		for (int column = 0; column < table.getColumnCount(); column++) {
    		    columnModel = (DefaultTableColumnModel) table.getColumnModel();
    		    TableColumn col = columnModel.getColumn(column);
    		    col.setPreferredWidth(widths1[column+1]);
    		}	  
    		JTableHeader header = table.getTableHeader();
    		header.addMouseListener(new TableHeaderMouseListener(table, index));
    		RowSorter<DefaultTableModel1> sorter = new TableRowSorter<DefaultTableModel1>(tableModel);
    		table.setRowSorter(sorter);
    		callPanelRenderer();
    	    return ;
    	}
    
    e qui il callPanelRenderer forse è proprio qui che ho gestito male la cosa ho applicato a tutte le colonne il renderer (eccezione fatta per il checkbox) altrimenti le celle non venivano colorate:
    
    
    protected void callPanelRenderer() {
    	for (int column = 0; column < table.getColumnCount()-1; column++) {
    		  table.getColumn(tableHeaders1[column+1]).setCellRenderer(new PanelRender());    
    	}
    }
    
    tableHeaders1 è un array di stringhe con i titoli delle colonne, avevo provato precedentemente con l'indice(intero) ma non funzionava nulla.


    Grazie mille.

    Ciao.
  • Re: RowSorter, righe colorate e checkbox

    Parlo per me, ma io nemmeno così riuscirei a trovare il problema.

    Non credo sia una cosa evidente, e avrei bisogno di avere un codice completo da compilare/eseguire per poter riprodurre il problema, e capire se riesco a risolvere.

    Riusciresti a postare un esempio completo, in cui sostituisci il resultSet con alcuni dati inseriti direttamente da codice, e togliendo tutte le classi che non c'entrano, ma producendo comunque qualcosa di compilabile/eseguibile in cui il problema è ancora presente? Altrimenti non credo proprio di farcela ...
  • Re: RowSorter, righe colorate e checkbox

    Grazie, ma purtroppo difficilmente ce la faccio.
    Come hai visto ricevo dati da un resultset, dovrei rivoluzionare tutto l'algoritmo e modificare parti molto grandi di codice per far quello che mi chiedi.
    Grazie ugualmente per l'interessamento.
  • Re: RowSorter, righe colorate e checkbox

    Problema scovato e risolto
    Era una caxxata pazzesca, a cui ho prestato davvero poca attenzione.
    Quando ho scritto questo:
    
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
          int modelRow = table.getRowSorter().convertRowIndexToModel(row);      
          Boolean b=(boolean)table.getModel().getValueAt(row, 6);
          if(!b) { 
             .......
          }
    }
    
    Il modelRow dovevo applicarlo anche alla successiva riga.
    In questo modo avevo un row differente al modelRow ed il comportamento era differente, perché il row era riferito alla riga prima del sort mentre il modelRow individuava correttamente la riga in base al nuovo tableModel
    
          Boolean b=(boolean)table.getModel().getValueAt(modelRow, 6);
           if(!b) { 
             .......
          }
    
    Grazie mille ugualmente.

    Ciao.
Devi accedere o registrarti per scrivere nel forum
5 risposte