2012-04-04 24 views
6

Estoy tratando de hacer que mi tabla seleccione una fila completa al hacer clic en una celda (lo que se puede hacer desactivando la columna de selección), pero, No quiero que el borde extra grueso alrededor de la celda específica en la que hizo clic esté resaltado. Tenía la esperanza de que esto sería fácil, pero al parecer se trata de extracción de grasas así que hice un montón de investigación y lo más cerca que puede obtener es la siguiente:Java - Swing - JTable - Establecer color para la fila seleccionada, pero no la celda

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()); 

copié muestra el procesador de un ejemplo y sólo ha cambiado la función hasFocus() para usar los colores que quería. Los colores de ajuste en isSelected() no hicieron nada.

El problema con este código es:

  1. que sólo funciona en una columna especificada por vColIndex en la parte inferior. Obviamente, quiero que esto se aplique a todas las columnas, por lo que al hacer clic en una celda en una se destaca toda la fila. Podría hacer un ciclo para cambiarlo a cada celda, pero creo que hay una forma mejor de hacerlo que cambie el CellRenderer para TODAS las columnas a la vez.

  2. setForegroundColor() trabaja para cambiar el texto pero setBackgroundColor() no hace nada para el fondo de las celdas. Me gustaría que realmente cambie el color de fondo como lo implica la propiedad.

    • Solución para el n. ° 2: utilice this.setOpaque(true); antes de asignar color de fondo.
  3. Cuando el renderizador funciona, solo funciona en una sola Celda. ¿Cómo puedo hacer que coloree todas las celdas de la fila?

    • Solución para # 3: ¡Lo descubrí! En lugar de usar hasFocus(), que solo afecta a la celda individual, si habilita la selección de fila (table.setRowSelectionAllowed(true)), cambia el color en la declaración if(isSelected). ¡Entonces toda la fila se considera seleccionada y colorea todas las celdas!

3 fue la más grande, pero si alguien sabe # 1 o me puede explicar por qué se ha diseñado de tal manera que sólo se puede aplicar el procesador a una columna a la vez que sería muy apreciada.

Respuesta

5

El artículo tutorial Concepts: Editors and Renderers explica que "un solo procesador de celdas se utiliza generalmente para extraer todas las células que contienen el mismo tipo de datos", como devuelto por el método del modelo getColumnClass().

Como alternativa, anule prepareRenderer(), que se invoca para todas las celdas, para alterar selectivamente el aspecto de una fila. Este example compara los dos enfoques, y el artículo Table Row Rendering amplía la versatilidad del enfoque.

0

Para la segunda pregunta puede probar los métodos setSelectionBackground (Color) y setSelectionForeGround (Color). No estoy seguro de cómo puedes resolver el primero. Y una última sugerencia puede usar algún plugin de diseñador de swing como JBuilder. Ayudaría mucho.

+0

Gracias por la respuesta. Intenté usar setSelectionBackground (Color) pero Eclipse lo marca como un método inexistente. – Daniel

+0

En realidad me di cuenta de que la parte, edité la publicación original. – Daniel

+0

Intenté el método setSelectionBackGround ahora y funciona. Cuando selecciono una o más filas, cambian sus colores. Pero tal vez entiendo mal lo que estás buscando. – mbaydar

12

demasiado directo simplemente añadir la línea

tablename.setSelectionBackground(Color.red); 

en mi caso

jtbillItems.setSelectionBackground(Color.red); 
+1

Solo si no tiene un TableCellRenderer que establece el color de fondo. En ese caso, debe agregar un 'if (! IsSelected) {setBackground (color1);}'. – FaithReaper

Cuestiones relacionadas