Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    JTable con singole celle lampeggianti

    Salve, avrei la seguente necessità.

    Ho una tabella (JTable) con un suo TableModel (extend defaultTableModel)

    la jtable è in particolare una CustomJTable extends JTable. QUindi è una classe a se che implementa anche il metodo getTableCellRendererComponent per dare un colore d spondo alle righe.

    QUello che vorrei fare adesso è questo.
    Io inserisco questa tabella in un JPanel e quindi la richiamo dalla mia classe MioJPanel.java

    vorrei che la tabella lampeggiasse o meglio alcune celle lampeggiano del colore ad esempio Rosso che dico io.

    TIpo io gli dico lampeggia la cella (riga 3, colonna 1), la cella (riga5 colonna2) poi quando non so cambia lo stato di una variabile smettono queste 2 celle di lampeggiare e iniziano a lampeggiare altre celle.

    E' possibile?

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    La risposta la conosci già:

    la jtable è in particolare una CustomJTable extends JTable. QUindi è una classe a se che implementa anche il metodo getTableCellRendererComponent per dare un colore d spondo alle righe.
    Devi fare l'override di getTableCellRendererComponent e colorare la cella che vuoi

  4. #4
    Si ho capito ma per farla lampeggiare??

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    L'effetto lampeggiante in una JTable non ti è fornito da nessuna funzione predefinita (almeno che io sappia) pertanto lo devi creare tu. Una soluzione semplice è quella di utilizzare una matrice "parallela" di booleani in cui riporti quale cella colorare... Forse uno snippet è più comprensibile di tante parole:

    codice:
    Object rowData[][] = new Object[nrRow][nrCol];
     
    boolean redColoring[][] = new boolean[nrRow][nrCol];
      
    String columnNames[] = new String[nrCol];
    
    JTable table = new JTable(rowData, columnNames);
        
        table.setDefaultRenderer(Object.class, new TableCellRenderer() {
        
          @Override
          public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
            
            JLabel label = new JLabel(value.toString());
            
            label.setOpaque(true);
    
            if (redColoring[row][column]) {
            
              label.setBackground(Color.RED);
            
            }
                   
            return label;
                   
            }
        
        });
    A questo punto ti gestisci il vettore di booleani, alzando o abbassando l'elemento che vuoi colorare. Solita precauzione: se la tua interfaccia grafica fa anche altre cose sarebbe auspicabile gestire questo flusso in un altro thread per evitare che l'esecuzione continua della getTableCellRendererComponent possa freezarti l'interfaccia.

  6. #6
    Allora provo a far vedere ciò che ho fatto io e che purtroppo non funxiona....

    codice:
    
    import java.awt.Color;
    import java.awt.Component;
    
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellRenderer;
    
    
    
    public class CustomTable extends JTable implements Runnable{
    
        /**
    	 * 
    	 */
    	private static final long serialVersionUID = 6844426758162170422L;
    	private DefaultTableModel modello;   // Sarà un riferimento al TableModel
    
        public CustomTable(DefaultTableModel tableModel) {
            super(tableModel);
            modello = tableModel;
        }
    
        @Override
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component rendererComponent = super.prepareRenderer(renderer, row, column);
    
            if (!isCellSelected(row, column)) {
                // Se la cella NON E' selezionata, verifico
                // se sussiste la condizione per colorarla
    
                // Inizialmente la cella sarà BIANCA
                rendererComponent.setBackground( Color.WHITE );
                if (true) {
                	System.out.println("stampo in blue");
                    // La condizione è verificata: coloro la cella di ROSSO
                    rendererComponent.setBackground( Color.BLUE );
                }else if(false){
                	System.out.println("stampo in rosso");
                	rendererComponent.setBackground( Color.RED );
                }
            }
    
            return rendererComponent;
        }
    
    	public void run(TableCellRenderer render) {
    		try{
    		Component rendererComponent = super.prepareRenderer(render, 0, 0);
    
            if (!isCellSelected(0, 1)) {
                // Se la cella NON E' selezionata, verifico
                // se sussiste la condizione per colorarla
    
            	while(true){
            		System.out.println("entro nel thread");
            		rendererComponent.setBackground( Color.WHITE );
            		Thread.sleep(1000);
            		rendererComponent.setBackground( Color.BLACK );
            		Thread.sleep(1000);
            	}
                // Inizialmente la cella sarà BIANCA
                        
            }
     
    	}catch(Exception e){
    		e.printStackTrace();
    	}
    		
    	}
    
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		
    	}
    }
    classe main
    codice:
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.table.DefaultTableModel;
    
    
    public class Avvio {
    	public static void main (String[] args){
    
    		DefaultTableModel model = new DefaultTableModel();
    		model.addColumn("First Name");
    		model.addColumn("Last Name");
    		model.addColumn("Years");
    
    		String[] socrates = { "Socrates", "", "469-399 B.C." };
    		model.addRow(socrates);
    
    		String[] plato = { "Plato", "", "428-347 B.C." };
    		model.addRow(plato);
    
    		String[] aquinas = { "Thomas", "Aquinas", "1225-1274" };
    		model.addRow(aquinas);
    
    		String[] kierkegaard = { "Soren", "Kierkegaard", "1813-1855" };
    		model.addRow(kierkegaard);
    
    		String[] kant = { "Immanuel", "Kant", "1724-1804" };
    		model.addRow(kant);
    
    		String[] nietzsche = { "Friedrich", "Nietzsche", "1844-1900" };
    		model.addRow(nietzsche);
    
    		String[] arendt = { "Hannah", "Arendt", "1906-1975" };
    		model.addRow(arendt);
    
    
    
    
    		CustomTable table = new CustomTable(model);  
    		JFrame f = new JFrame();  
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    		f.getContentPane().add(new JScrollPane(table));  
    		//f.getContentPane().add(test.getControls(table), "South");  
    		f.setSize(400,400);  
    		f.setLocation(200,200);  
    		f.setVisible(true);
    		
    		table.run(table.getCellRenderer(0, 1));
    	}
    }
    L'effetto che ottengo è solamente una tabella con lo sfondo blue e stop

    Però io vedo che il mio thread viene sempre richiamato

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    Beh, a parte la gestione abbastanza singolare del thread (mai visto l'overload del metodo run con conseguente invocazione esplicita: in genere si fa l'override ed eventuali parametri li passi al costruttore della classe, poi il thread si fa partire con il metodo start) In ogni caso, dov'è il rendering della singola cella? I renderer agiscono sul componente che li invoca, che in questo caso è una JTable... per questo motivo la vedi tutta blu...

  8. #8
    e lo so sto facendo delle prove, è la prima volta che vado ad impattare con i thread e con questo tipo di situazione.

    Da dove dobbiamo partire???

    Io ho visto che in pratica, il gioco sta nel definire nel metodo prepareRenderer della mia CustomTable il tutto.

    Però non so come fare....

    Nel frattempo di ricevere nuove news cerco di sperimentare una nuova soluzione

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    147
    e lo so sto facendo delle prove, è la prima volta che vado ad impattare con i thread e con questo tipo di situazione.
    Ok, ti consiglio di partire dai mattoni fondamentali del linguaggio e capire come farli funzionare bene, altrimenti già di base potresti ottenere un'esecuzione del programma che è diversa da ciò che ti aspetti e non lo sai neppure...

    Da dove dobbiamo partire???

    Io ho visto che in pratica, il gioco sta nel definire nel metodo prepareRenderer della mia CustomTable il tutto.

    Però non so come fare....
    Scusa hai letto il mio secondo post? Ti ho consigliato una possibile soluzione, tra l'altro anche abbastanza semplice...

  10. #10
    ok va bene proverò

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.