2012-04-04 5 views
6

Ich versuche, meine Tabelle eine ganze Zeile auswählen, wenn Sie auf eine Zelle klicken (was durch Deaktivieren der Spaltenauswahl getan werden kann), aber ich Ich möchte nicht, dass der extra dicke Rahmen um die ausgewählte Zelle hervorgehoben wird. Ich hatte gehofft, dies einfach sein würde, aber anscheinend es sich um Renderer so dass ich eine Menge Forschung getan und das nächste, was ich bekommen kann, ist dies:Java - Swing - JTable - Setzen Sie Farbe für ausgewählte Zeile, aber nicht Zelle

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

ich die Renderer von einem Beispiel kopiert und verändert nur die hasFocus() Funktion die Farben zu benutzen, die ich wollte. Einstellen der Farben in isSelected() hat nichts getan.

Das Problem mit diesem Code ist:

  1. Es funktioniert nur auf einer Säule von vColIndex am Boden festgelegt. Offensichtlich möchte ich, dass dies auf alle Spalten angewendet wird. Wenn Sie also auf eine Zelle in einem klicken, wird die gesamte Zeile hervorgehoben. Ich könnte eine for-Schleife machen, um sie in jede Zelle zu ändern, aber ich denke, es gibt einen besseren Weg, dies zu tun, der den cellRenderer für ALLE Spalten gleichzeitig ändert.

  2. setForegroundColor() funktioniert, um Text zu ändern, aber setBackgroundColor() tut nichts zum Zellenhintergrund. Ich möchte, dass die Hintergrundfarbe tatsächlich geändert wird, wie es die Eigenschaft impliziert.

    • Lösung für # 2: Verwenden Sie this.setOpaque(true); vor dem Zuweisen von Hintergrundfarbe.
  3. Wenn der Renderer funktioniert, funktioniert es nur für eine einzelne Zelle. Wie bekomme ich es, um alle Zellen in der Reihe zu färben?

    • Lösung für # 3: Ich habe es herausgefunden! Anstatt hasFocus() zu verwenden, was sich nur auf die einzelne Zelle auswirkt, wenn Sie die Zeilenauswahl aktivieren (table.setRowSelectionAllowed(true)), ändern Sie die Farbe in der if(isSelected)-Anweisung. Dann gilt die ganze Zeile als ausgewählt und es werden alle Zellen eingefärbt!

3 war die große, aber wenn jemand weiß, # 1 oder kann mir erklären, warum es so entworfen wurde, dass Sie nur den Renderer auf eine Spalte zu einer Zeit anwenden können, wäre es sehr geschätzt werden.

Antwort

5

Der tutorial Artikel Concepts: Editors and Renderers erklärt, dass „eine einzelne Zelle Renderer allgemein alle Zellen verwendet wird, die die gleiche Art von Daten enthalten, ziehen“, wie sie durch das Modell des getColumnClass() Methode zurückgegeben.

Alternativ können Sie die prepareRenderer() überschreiben, die für alle Zellen aufgerufen wird, um das Aussehen einer Zeile selektiv zu ändern. Diese example vergleicht die zwei Ansätze, und der Artikel Table Row Rendering erweitert die Vielseitigkeit des Ansatzes.

0

Für die zweite Frage können Sie die Methoden setSelectionBackground (Color) und setSelectionForeGround (Color) ausprobieren. Ich bin mir nicht sicher, wie du das erste lösen kannst. Und einen letzten Vorschlag können Sie ein Swing-Designer-Plugin wie JBuilder verwenden. Es würde viel helfen.

+0

Vielen Dank für die Antwort. Ich habe versucht, setSelectionBackground (Color) zu verwenden, aber Eclipse-Flags als eine nicht existierende Methode. – Daniel

+0

Eigentlich habe ich diesen Teil rausgefunden, ich habe den ursprünglichen Beitrag bearbeitet. – Daniel

+0

Ich habe jetzt die Methode setSelectionBackGround ausprobiert und es funktioniert. Wenn ich eine oder mehrere Zeilen auswähle, werden ihre Farben geändert. Aber vielleicht verstehe ich falsch, wonach du suchst. – mbaydar

12

zu direkt fügen Sie einfach tun Linie

tablename.setSelectionBackground(Color.red); 

in meinem Fall

jtbillItems.setSelectionBackground(Color.red); 
+1

Nur wenn Sie keinen TableCellRenderer haben, der die Hintergrundfarbe festlegt. In diesem Fall müssen Sie ein 'if (! IsSelected) {setBackground (color1);}' hinzufügen. – FaithReaper