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

    Celle della JTable

    salve, volevo togliermi un pò di curiosità.

    1)esiste un modo per far espandere il contenuto di una cella di una JTable quando ci passo il mouse sopra? oppure quando ci clicco dentro, tipo excel?
    cioè se dentro la cella ci sta scritto: "la maledizione della prima luna" a me si visualizza solo "la maledizione delle pr.."

    2)per fare le righe pari di un colore e quelle dispari di un altro(intendo lo sfondo di una riga), devo per forza costruirmi una classe che mi fa solo il render della JTable?

    3)per quanto riguarda la larghezza della colonne della mia jTable gli ho impostato delle dimensioni fisse, come faccio a far si che si adattino al contenuto interno?

    ciao e grazie..

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Per il punto 3 c'è un po' di materiale in rete. Ad esempio vedi qui:
    http://forum.java.sun.com/thread.jsp...sageID=9575685
    Per il punto 2, io avevo un problema simile: evidenziare alcune righe che rispondessero a requisiti particolare. Ho risolto estendendo la classe JTable e facendo l'overriding del metodo prepareComponent. Non so se è necessario estendere la classe JTable, ma a me serviva comunque per gestirne la stampa quindi mi andava bene. Comunque se a te serve solo evidenziare le righe pari dovrebbe andare bene questo:
    codice:
    public Component prepareRenderer(TableCellRenderer cr, int row, int col)
    {
          Component c = super.prepareRenderer(cr, row, col);
          if (row%2 == 0)
          {
             c.setBackground(new Color(x,y,z));
          }
          else if (isRowSelected(row)) {
             c.setBackground(getSelectionBackground());
          }
          else c.setBackground(getBackground());
             return c;
    }

  3. #3
    ciao signal, per fare le righe di colore alternato ho fatto così:
    codice:
     public class MyTableRenderer extends DefaultTableCellRenderer {
    
       private final Color ALTERNATE_COLOR = new Color(232,242,254);
      
       
    	public Component getTableCellRendererComponent(JTable table, Object value,
    		boolean isSelected, boolean hasFocus, int row, int column)
    	{
    		
    		Component original = super.getTableCellRendererComponent(
    			table, value, isSelected, hasFocus, row, column);
    			
    		
            
        
            setHorizontalAlignment(RIGHT); //qui ho un problema
            	
    		Color background =
    			isSelected ?
    			table.getSelectionBackground() :
    			row % 2 == 0 ?
    			ALTERNATE_COLOR :
    			table.getBackground();
    		original.setBackground(background);
    		return original;
    	}
    }
    quel setHorizontalAlignment(RIGHT) mi fa l'allineamento di tutte le colonne a destra, ecco io volevo solo che la colonna degli interi si allineava a destra, come si fa?

    il codice sopra mi fa correttamente una riga di un colore e una riga di un altro colore.
    in un'altra JTable che ho, volevo fare una cosa diversa e cioè impostare il una riga di un colore e un'altra di colore diverso ma...
    ti faccio un esempio così mi spiego meglio.

    ho la mia JTable con:

    CD titolo autore ecc ecc
    1 io io
    1 tu tu
    1 egli egli
    2 noi noi
    2 voi voi
    2 essi essi
    3 prova prova2

    ecco dove ci sono gli 1 devo fare le righe dello stesso colore
    per il 2 lo stesso discorso
    e il 3 uguale..

    quindi sempre alternando i due colori ma stavolta in base alla colonna CD, mi sono spiegato signal?
    ciao e grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Probabilmente basta applicare setHorizontalAlignment(RIGHT) all'oggetto original, dunque fare original.setHorizontalAlignment(RIGHT). Per quanto riguarda il secondo problema, puoi usare la stessa strategia modificando il metodo getTableCellRendererComponent in modo da
    esaminare il valore della cella in esame - coordinate (row, column) - con il metodo getValueAt(row, X) dove X è la colonna d'interesse (CD nell'esempio) e scegliere il colore in base al numero risultante. Spero di aver capito bene.

  5. #5
    original.setHorizontalAlignment(RIGHT) non funziona, mi dice

    GUIDistributore.java:546: cannot find symbol
    symbol : method setHorizontalAlignment(int)
    location: class java.awt.Component
    original.setHorizontalAlignment(RIGHT);
    ma poi che c'entra original io devo dargli il nome della colonna oppure il numero della colonna e lui mi deve fare l'allineamento, penso..

    l'altro punto dove mi hai detto che potavo utilizzare la stessa strategia non capisco proprio come devo farlo..

    scusami signal ma sono un pò di coccio io eh eh..

    se tu hai una classe meglio di quella che ho io sopra, dimmi caso mai come faresti tu..
    ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Sì scusa, effettivamente ho dimenticato di dirti che serve definire original come JLabel e fare un cast:
    JLabel original = (JLabel) super.getTableCellRendererComponent(
    table, value, isSelected, hasFocus, row, column);
    original serve perché è il componente con cui si fa il rendering della cella... Come al solito non ho provato, ma dovrebbe andare purché la tua tabella contenga elementi "testuali", come penso che sia: per sicurezza ho controllato in rete e qui si è usato esattamente lo stesso metodo.
    Scusa ma se il colore di una riga si deduce dal valore di una sua colonna, allora nel metodo getTableCellRendererComponent() - che ricordo è eseguito su ogni cella, per questo ci sono i parametri row e column - devi prendere il valore di tale colonna per la riga di quella cella, che è row: questo si ottiene con getValueAt(row, col) applicato alla JTable. Ricavato il valore setti il colore di conseguenza.

  7. #7
    io avevo detto:
    quel setHorizontalAlignment(RIGHT) mi fa l'allineamento di tutte le colonne a destra, ecco io volevo solo che la colonna degli interi si allineava a destra, come si fa?
    e tu adesso mi dici:
    dovrebbe andare purché la tua tabella contenga elementi "testuali",
    ascolta tu sei bravo signal però, io non ho capito.
    evidentemente io cambio le cose che mi dici tu, ma forse devo aggiungerne delle altre..

    quando ti ho parlato dell'allineamento era perchè io ho tutte le colonne con del testo dentro, tranne una che contiene interi.
    ora i valori stanno allineati per default tutti a sinistra ed io se uso quel setHorizontalAlignment(RIGHT); così come lo vedi, mi allinea tutto a destra.

    ora io volevo che solo la colonna degli interi mi si allineasse a destra che è la colonna che si chiama Mb(megabyte) oppure la numero 4..e tu mi hai detto di scrivere


    ho dimenticato di dirti che serve definire original come JLabel e fare un cast:
    JLabel original = (JLabel) super.getTableCellRendererComponent(
    table, value, isSelected, hasFocus, row, column);
    allora io ho fatto:
    codice:
    public class MyTableRenderer extends DefaultTableCellRenderer {
    
       private final Color ALTERNATE_COLOR = new Color(232,242,254);
      
       
    	public Component getTableCellRendererComponent(JTable table, Object value,
    		boolean isSelected, boolean hasFocus, int row, int column)
    	{
    		
    		JLabel original =(JLabel) super.getTableCellRendererComponent(
    			table, value, isSelected, hasFocus, row, column);
    			
    		
            
        
            original.setHorizontalAlignment(RIGHT); 
            	
    		Color background =
    			isSelected ?
    			table.getSelectionBackground() :
    			row % 2 == 0 ?
    			ALTERNATE_COLOR :
    			table.getBackground();
    		original.setBackground(background);
    		
    		return original;
    	}
    }
    ma il risultato non cambia...come faccio a dirgli che deve essere la mia colonna degli interi ad allinearsi a destra?

    per quanto rigurda l'altro punto io non so come scriverlo signal, quello che dico a parole..
    codice:
    public class MyTableRenderer extends DefaultTableCellRenderer {
    
       private final Color ALTERNATE_COLOR = new Color(232,242,254);
      
       
    	public Component getTableCellRendererComponent(JTable table, Object value,
    		boolean isSelected, boolean hasFocus, int row, int column)
    	{
    		
    		JLabel original =(JLabel) super.getTableCellRendererComponent(
    			table, value, isSelected, hasFocus, row, column);
    			
    		
            
        
            original.setHorizontalAlignment(RIGHT); 
            	
    		Color background =
    			isSelected ?
    			table.getSelectionBackground() :
    
    		se il contenuto della prima colonna della prima riga, è uguale al 
                     al contenuto della prima colonna della seconda riga e così via, allora ?
    
    			ALTERNATE_COLOR ://fai questo
    			table.getBackground();//altrimenti fai questo
    		original.setBackground(background);
    		
    		return original;
    	}
    }
    grazie signal

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Ok, non avevo capito volessi solo quella colonna. Ci sono due strade:
    - table.getColumn("Mb").setCellRenderer() e gli passi un oggetto MyTableRenderer come quello sopra, questo però implica che tutte le altre celle usano il renderer di default.
    - all'interno del metodo getTableCellRendererComponent esegui original.setHorizontalAlignment(RIGHT) solo se il parametro column è uguale a 4, quindi la cella appartiene a quella colonna.
    Visto che devi anche colorare le righe, ti conviene il secondo perché non puoi limitarti ad una colonna. E qui non ci intendiamo: io ho capito che tu vuoi colorare una riga secondo il valore di una sua colonna, che chiamo C: se la colonna vale X un colore, se vale Y un altro colore... E' giusto? Da quello che hai scritto in pseudo-codice, mi sembra che tu voglia evidenziare le righe consecutive che hanno lo stesso valore in quella colonna: beh ma allora ci siamo perché se fai degli accoppiamenti valore-colore ottieni ugualmente lo scopo, e in modo più efficiente. Spero di averti capito e di essere stato chiaro.

  9. #9
    esatto signal, hai capito..ora come traduco il mio pseudocodice?
    ciao

  10. #10
    signal nessuna novità per il mio problema?
    come faccio a fare quello che stavamo dicendo
    Da quello che hai scritto in pseudo-codice, mi sembra che tu voglia evidenziare le righe consecutive che hanno lo stesso valore in quella colonna: beh ma allora ci siamo perché se fai degli accoppiamenti valore-colore ottieni ugualmente lo scopo, e in modo più efficiente. Spero di averti capito e di essere stato chiaro.
    ciao

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.