2012-04-04 17 views
6

Sto provando a fare in modo che la mia tabella selezioni un'intera riga quando si fa clic su una cella (operazione che può essere eseguita disattivando la selezione della colonna), ma, I non voglio il bordo più spesso intorno alla cella specifica su cui hai fatto clic per essere evidenziato. Speravo che questo sarebbe stato facile, ma a quanto pare si tratta di renderer così ho fatto un sacco di ricerche e la più vicina che può ottenere è questo:Java - Swing - JTable - Imposta il colore per la riga selezionata, ma non la cella

JTable contactTable = new JTable(tableModel); 

    contactTable.setCellSelectionEnabled(true); 
    contactTable.setColumnSelectionAllowed(false); 
    contactTable.setRowSelectionAllowed(false); 
    contactTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

    // This renderer extends a component. It is used each time a 
    // cell must be displayed. 
    class MyTableCellRenderer extends JLabel implements TableCellRenderer { 
     // This method is called each time a cell in a column 
     // using this renderer needs to be rendered. 
     public Component getTableCellRendererComponent(JTable table, Object value, 
       boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) { 
      // 'value' is value contained in the cell located at 
      // (rowIndex, vColIndex) 

      if (isSelected) { 
       // cell (and perhaps other cells) are selected 

      } 

      if (hasFocus) { 
       // this cell is the anchor and the table has the focus 
       this.setBackground(Color.blue); 
       this.setForeground(Color.green); 
      } else { 
       this.setForeground(Color.black); 
      } 

      // Configure the component with the specified value 
      setText(value.toString()); 

      // Set tool tip if desired 
      // setToolTipText((String)value); 

      // Since the renderer is a component, return itself 
      return this; 
     } 

     // The following methods override the defaults for performance reasons 
     public void validate() {} 
     public void revalidate() {} 
     protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {} 
     public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {} 
    } 

    int vColIndex = 0; 
    TableColumn col = contactTable.getColumnModel().getColumn(vColIndex); 
    col.setCellRenderer(new MyTableCellRenderer()); 

Ho copiato il renderer da un esempio e ha cambiato solo la funzione hasFocus() usare i colori che volevo. L'impostazione dei colori in isSelected() non ha fatto nulla.

Il problema con questo codice è:

  1. funziona solo su una colonna specificata dal vColIndex in basso. Ovviamente lo voglio applicato a tutte le colonne, quindi facendo clic su una cella in una evidenzia l'intera riga. Potrei fare un ciclo for per cambiarlo in ogni cella ma immagino ci sia un modo migliore per farlo che cambia il cellRenderer per TUTTE le colonne contemporaneamente.

  2. funziona per modificare il testo ma setBackgroundColor() non fa nulla sullo sfondo delle celle. Mi piacerebbe che cambiasse effettivamente il colore di sfondo come implica la proprietà.

    • Soluzione per n. 2: utilizzare this.setOpaque(true); prima di assegnare backgroundcolor.
  3. Quando il renderer funziona, funziona solo su una singola cella. Come posso colorare tutte le celle nella fila?

    • Soluzione per # 3: l'ho capito! Invece di utilizzare hasFocus(), che influisce solo sulla singola cella, se si abilita la selezione di riga (table.setRowSelectionAllowed(true)), si modifica il colore nell'istruzione if(isSelected). Quindi l'intera riga viene considerata selezionata e colora tutte le celle!

3 è stato uno dei grandi, ma se qualcuno conosce # 1 oppure può spiegare a me perché è stato progettato in modo tale che si può applicare solo il renderer di una colonna in un momento che sarebbe molto apprezzato.

risposta

5

L'articolo esercitazione Concepts: Editors and Renderers spiega che "una singola renderer di celle è generalmente utilizzato per disegnare tutte le celle che contengono lo stesso tipo di dati", come restituito con il metodo getColumnClass() del modello.

alternativa, override prepareRenderer(), che viene richiamato per tutti cellule, di modificare selettivamente l'aspetto di una riga. Questo example confronta i due approcci e l'articolo Table Row Rendering espande la versatilità dell'approccio.

0

Per la seconda domanda è possibile provare i metodi setSelectionBackground (Colore) e setSelectionForeGround (Colore). Non sono sicuro di come puoi risolvere il primo. E un ultimo suggerimento è possibile utilizzare alcuni plugin swing designer come JBuilder. Aiuta molto.

+0

Grazie per la risposta. Ho provato a usare setSelectionBackground (Color) ma Eclipse lo contrassegna come un metodo inesistente. – Daniel

+0

In realtà ho capito quella parte, ho modificato il post originale. – Daniel

+0

Ho provato il metodo setSelectionBackGround ora e funziona. Quando seleziono una o più righe, i loro colori sono cambiati. Ma forse capisco male quello che stai cercando. – mbaydar

12

troppo diretto proprio non aggiungere linea

tablename.setSelectionBackground(Color.red); 

nel mio caso

jtbillItems.setSelectionBackground(Color.red); 
+1

Solo se non si dispone di un TableCellRenderer che imposta il colore di sfondo. In tal caso, devi aggiungere un 'if (! IsSelected) {setBackground (color1);}'. – FaithReaper

Problemi correlati