Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207

    Colorare colonne jTable

    Ho bisogno ancora del vostro aiuto..qualcuno ha per caso idea di come si colorano le colonne di una jtable?

    io in pratica ho un table come questa :



    e vorrei che quando nell'intestazione della colonna (la chiamo intestazione, ma non è la vera intestazione..perchè ho fatto getColumnName = null) c'è un numero dispari l'intera colonna mi si colori di giallo...è fattibile questa cosa

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    in pratica sto procedendo così :

    codice:
    if (!isCellSelected(row, column)) {
            	
            	if (row == 0){
            		
            		for (int i=1; i<=listatreni.size(); i++){
            			
            			if (Pari(getValueAt(row,i))){
            				
            				
            			}
            		}
            		
            	}
            	
            }
    In pratica in questo ciclo, sto facendo che se mi trovo nella prima riga(quella con indice 0), scandisco tutte le celle della prima riga (con il ciclo for) e voglio verificare se il valore in ogni singola cella è pari o dispari, se è dispari coloro la colonna. Il problema è che getValueAt restituisce un tipo Object....come lo faccio a trasformare in int? perchè la mia funzione Pari è fatta così :

    codice:
    private boolean Pari(Object valueAt) {
    	  boolean test = true;
    		
    		if (valueAt % 2 == 0){
    			
    			test = true;
    			System.out.print("pari");
    		}
    		return test;
    	}
    e naturalmente quando faccio l'if per trovare il modulo mi dice che valueAt non è int...

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    il problema della funzione Pari l'ho risolto così :

    codice:
    if (!isCellSelected(row, column)) {
            	
            	
            		
            		for (int i=1; i<listatreni.size(); i++){
            			int j = Integer.parseInt(listatreni.get(i).toString());
            			if (Pari(j)){
            				if(row == 0 || column == j){
            				rendererComponent.setBackground(Color.yellow);}
            			}
            		}
            }
    In pratica faccio il controllo direttamente sugli elementi della mia lista, che poi sono le intestazioni della colonna.


    codice:
    private boolean Pari(int numero) {
    	  boolean test = true;
    		
    		if (numero % 2 == 0){
    			
    			test = true;
    			System.out.print("pari");
    		}
    		return test;
    	}
    Però ottengo uno strano effetto.....mi colora la prima riga di giallo ..io invece volevo le colonne con intestazione dispari gialle

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Colorare colonne jTable

    Originariamente inviato da jin85
    come si colorano le colonne di una jtable?
    Le soluzioni generalmente sono 3:

    a) Si implementa un apposito "renderer" (che si occupi di tutto, non solo dello sfondo).

    b) Si implementa un "renderer" che fa da "wrapper" di un altro renderer (es. quello di default per una certa colonna/tipo) che modifica solo ciò che serve (es. il testo o qualche aspetto visuale).

    c) Si estende JTable e si fa l'override di prepareRenderer(), vedere tra i miei Java Examples sezione Tables l'esempio che cambia lo sfondo delle righe (ma si può anche fare "a colonne" ovviamente).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    infatti è quello che ho fatto :

    codice:
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component rendererComponent = super.prepareRenderer(renderer, row, column);
    
            if (!isCellSelected(row, column)) {
                if (row == 0 || column == 0) {
                    rendererComponent.setBackground(Color.LIGHT_GRAY);
                } else {
                    rendererComponent.setBackground(Color.WHITE);
                }
            }
            //METODO DA CONTROLLARE-NON BENE (colorare di giallo le colonne dispari)
            if (!isCellSelected(row, column)) {
            	
            		for (int i=1; i<listatreni.size(); i++){
            			int j = Integer.parseInt(listatreni.get(i).toString());
            			//System.out.print(listatreni.size());
            			if (Pari(j)){
            				if (column == i && row !=0){
            				rendererComponent.setBackground(Color.YELLOW);
            				}
            			}
            		}
                
            }
    
            return rendererComponent;
        }
    La funzione Pari è questa :

    codice:
    private boolean Pari(int numero) {
    	  boolean test = true;
    		
    		if (numero % 2 == 0){
    			
    			test = true;
    			System.out.print("pari");
    		} else {
    			System.out.print("dispari");
    		}
    		return test;
    	}

    Però se nel renderer metto !Pari() mi colora tutte le colonne di giallo (e io invece voglio che mi colori solo quelle con "l'intestazione" con numero dispari. Se invece metto Pari() non mi colora nulla

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da jin85
    codice:
            		for (int i=1; i<listatreni.size(); i++){
            			int j = Integer.parseInt(listatreni.get(i).toString());
            			//System.out.print(listatreni.size());
            			if (Pari(j)){
            				if (column == i && row !=0){
            				rendererComponent.setBackground(Color.YELLOW);
            				}
            			}
                              }
    Non vedo per quale motivo devi fare un ciclo for. E meno ancora capisco perché dal valore del get() ottieni un String e poi fai il parseInt. Cosa contiene quella lista?

    E comunque ripeto, il for non ha senso. Il prepareRenderer() viene invocato cella per cella per preparare il renderer da usare, quindi lì in quel punto potresti basarti su riga/colonna o eventualmente sul contenuto della cella.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    La lista contiene i valori che metto come intestazione delle colonne, se guardi la figura che ho postato ci sono dei numeri sulle colonne, quei numeri li prendo dalla lista. Ripeto comunque quella non è una vera intestazione (nel senso che io ho messo getcolumnames = null), quella è semplicemente la riga di indice 0, dove ho messo i valori delle colonne( un pò quello che hai fatto tu nei tuoi esempi, nella tabellina delle moltiplicazioni)..

    Ora io voglio che quando nell' "intestazione" della colonna c'è un numero dispari, mi deve colorare tutta la colonna di giallo...

    Il ciclo for lo usavo per scandirmi i valori della mia lista e quando trovo un valore dispari nella lista, associo l'indice del valore dispari all'indice della colonna...e coloro quella colonna con quell'indice di giallo....ma a quanto pare è sbagliato...perchè ho i problemi che ho descritto prima....non ho capito quindi cm fare..

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da jin85
    Ora io voglio che quando nell' "intestazione" della colonna c'è un numero dispari, mi deve colorare tutta la colonna di giallo...
    Quindi il contenuto del "header"?? Questo te lo dà il model con getColumnName() (qualunque sia il model usato).

    Nota che la colonna passata a prepareRenderer() è della "view" ... non del model (se non è stato disabilitato, l'utente può spostare le colonne). Quindi se vuoi prendere l'header dal model devi traslare la colonna (convertColumnIndexToModel() ).

    Però il prepareRenderer viene invocato cella per cella (e tu non sai in quale sequenza) e tutta questa operazione prendi-header-parse-test-dispari la faresti per ogni cella, quindi un pelino pesante.
    Se tu avessi realizzato un tuo model, allora potrebbe essere utile che sia il model ad "esporre" la informazione "guarda che questa colonna è dispari".

    Comunque prova come ho detto sopra (non stare a vedere se è pesante più di tanto ...), prendi il nome colonna, fai il parse, se è dispari colora di giallo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    Questa è la mia intera classe....se può servirti...

    codice:
    package prova;
    
    import java.awt.*;
    import java.io.File;
    import java.io.IOException;
    import java.util.*;
    import java.util.List;
    
    import javax.swing.*;
    import javax.swing.table.*;
    
    import com.parctechnologies.eclipse.CompoundTerm;
    import com.parctechnologies.eclipse.EclipseEngine;
    import com.parctechnologies.eclipse.EclipseEngineOptions;
    import com.parctechnologies.eclipse.EclipseException;
    import com.parctechnologies.eclipse.EmbeddedEclipse;
    
    import esempiTable.Person;
    
    
    public class TabOrari  {
    	
        public static void main(String[] args){
        	
    
        	SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    try {
    					new TabOrariFrame().setVisible(true);
    				} catch (EclipseException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
                }
            });
        }
    }
    
    
    class TabOrariFrame extends JFrame {
        private TabOrariModel tableModel;
        private JTable table;
        private JScrollPane scrollPane;
    
        public TabOrariFrame() throws EclipseException, IOException {
            super("Tabella Orari");
    
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(350, 250);
            setLocationRelativeTo(null);
            
    //      Create some default Eclipse options
    	    EclipseEngineOptions eclipseEngineOptions = new EclipseEngineOptions();
    
    	    // Object representing the Eclipse process
    	    EclipseEngine eclipse;
    	    
            // Path of the Eclipse program
    	    File eclipseProgram;
    
    	    // Connect the Eclipse's standard streams to the JVM's
    	    eclipseEngineOptions.setUseQueues(false);
    
    	    // Initialise Eclipse
    	    eclipse = EmbeddedEclipse.getInstance(eclipseEngineOptions);
    	    
    	    String sep = System.getProperty("file.separator");
    	    
    	    // Set up the path of the example Eclipse program to be used.
    	    eclipseProgram = new File(System.getProperty("eclipse.directory") +
    				   sep + "doc" + sep + "examples" + sep +
    	                            "JavaInterface" + sep +
    				   "test.pl");
    	    
    	    //compile the eclipse program
    	    eclipse.compile(eclipseProgram);
    	    //Query che richiedo ad ECLIPSE
    	    CompoundTerm result = eclipse.rpc("findall(X,percorso(X,H,Min,Max),L)");
    	    //Il risultato della mia query si trova nel terzo argomento (perchè è X l'incognita)
    	    List listatreni = (List)result.arg(3);
    	    //Object firstGoalFirstArg = firstGoal.arg(1);
    	    //System.out.println(listatreni);
    	    listatreni.add(0,"");
    	    System.out.println(listatreni);
    	    
    	    // Destroy the Eclipse
    	    ((EmbeddedEclipse) eclipse).destroy();
    
            tableModel = new TabOrariModel(listatreni);
    
            //table = new JTable(tableModel);
            table = new TabOrariTable(listatreni);
            scrollPane = new JScrollPane(table);
    
            getContentPane().add(scrollPane);
        }
    
    	
    }
    
    class TabOrariTable extends JTable {
    	 private static List listatreni;
        public TabOrariTable(List listatreni) {
        	super(new TabOrariModel(listatreni));
        	this.listatreni = listatreni;
            
        }
    
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component rendererComponent = super.prepareRenderer(renderer, row, column);
    
            if (!isCellSelected(row, column)) {
                if (row == 0 || column == 0) {
                    rendererComponent.setBackground(Color.LIGHT_GRAY);
                } else {
                    rendererComponent.setBackground(Color.WHITE);
                }
            }
            //METODO DA CONTROLLARE-NON BENE (colorare di giallo le colonne dispari)
            if (!isCellSelected(row, column)) {
            	
            		for (int i=1; i<listatreni.size(); i++){
            			int j = Integer.parseInt(listatreni.get(i).toString());
            			//System.out.print(listatreni.size());
            			if (Pari(j)){
            				if (column == i && row !=0){
            				rendererComponent.setBackground(Color.YELLOW);
            				}
            			}
            		}
                
            }
    
            return rendererComponent;
        }
    
    	private boolean Pari(int numero) {
    	  boolean test = true;
    		
    		if (numero % 2 == 0){
    			
    			test = true;
    			System.out.print("pari");
    		} else {
    			System.out.print("dispari");
    		}
    		return test;
    	}
    
    	
    }
    
    class TabOrariModel extends AbstractTableModel {
    	private static String[] rowNames = {"","Foggia", "Foggia-Incoronata", "Incoronata", "Incoronata-Ortanova","Ortanova","Ortanova-Cerignola","Cerignola","Cerignola-Candida","Candida","Candida-Trinitapoli","Trinitapoli","Trinitapoli-Ofantino","Ofantino","Ofantino-Barletta","Barletta","Barletta-Trani","Trani","Trani-Bisceglie","Bisceglie","Bisceglie-Molfetta","Molfetta","Molfetta-Giovinazzo","Giovinazzo","Giovinazzo-Bari S.Spirito","Bari S.Spirito","Bari S.Spirito-Bari Z.I.","Bari Z.I.","Bari Z.I.-Bari Parco Nord","Bari Parco Nord","Bari Parco Nord-Bari C.le","Bari C.le"};
    	
    	
    	//The internal structure of the model is an ArrayList<Person>.
        private List listatreni;
        
        
        
        public TabOrariModel(List listatreni) {
            this.listatreni = listatreni;
        }
        
    	public int getRowCount() {
    		
    		return rowNames.length;
        }
    	
    	public int getColumnCount() {
            return listatreni.size();
        }
    	
    	public String getRowName(int row) {
            return rowNames[row];
        }
    	
    	public String getColumnName(int column) {
    		//System.out.print(listatreni.get(column).toString());
            //return listatreni.get(column).toString();
            return null;
        }
    	
    	public boolean isCellEditable(int row, int column) {
            return false;   // All cells are NOT editable!
        }
    	
    	public Object getValueAt(int row, int column) {
    		
    		
    		//int v;
    
            if (row == 0) {
                if (column == 0) {
                    return "";         // nella cella (0,0) c'è uno spazio vuoto.
                } else {
                    return listatreni.get(column).toString();         // nelle celle (0,N) c'è il valore della colonna (successivamente ci sarà il num treno).
                    
                }
            } else {
                if (column == 0) {
                	return getRowName(row);            // Nelle celle (N,0) c'è il nome della stazione.
                } else {
                    return null;   // Nelle celle (N,N) ci sarà il valore dei minuti..
                }
            }
    
            //return new Integer(v);
    		
    	}
    	
    	
    }
    ora provo come hai detto...

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    207
    scusami ho detto ci provo.....ma ora che mi stavo cimentando non ho ben capito che devo fare potresti aiutarmi scrivendomi il pezzo di codice da integrare nella mia classe?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.