2012-04-04 12 views
6

Próbuję zrobić, aby mój stół zaznaczał cały wiersz po kliknięciu komórki (co można zrobić, wyłączając opcję wyboru kolumny), ale ja nie chcę, aby podświetlona była dodatkowa gruba ramka wokół wybranej komórki. Miałam nadzieję, że to będzie łatwe, ale najwyraźniej wiąże renderujące tak zrobiłem wiele badań i najbliższy mogę uzyskać to:Java - Swing - JTable - Ustaw kolor dla zaznaczonego wiersza, ale nie dla komórki

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

skopiowane Renderer z przykładu i tylko zmienił funkcję hasFocus() używać kolorów, które chciałem. Ustawienie kolorów w isSelected() nic nie dało.

Problem z tym kodem jest:

  1. To działa tylko na jednej kolumnie określonej przez vColIndex na dole. Oczywiście chcę, żeby to było stosowane do wszystkich kolumn, więc kliknięcie komórki w jednym podświetla cały wiersz. Mogłem utworzyć pętlę for, aby zmienić ją na każdą komórkę, ale myślę, że jest lepszy sposób na zrobienie tego, co zmienia cellRenderer dla WSZYSTKICH kolumn na raz.

  2. setForegroundColor() działa, aby zmienić tekst, ale setBackgroundColor() nic nie robi na tle komórek. Chciałbym, żeby zmieniła kolor tła, tak jak sugeruje to właściwość.

    • Rozwiązanie dla # 2: Przed przypisaniem koloru tła użyj this.setOpaque(true);.
  3. Gdy renderer działa, działa tylko na jednej komórce. Jak mogę go pokolorować wszystkie komórki w rzędzie?

    • Rozwiązanie dla nr 3: Rozgryzłem to! Zamiast korzystania z hasFocus(), która wpływa tylko na pojedynczą komórkę, jeśli włączono wybór wiersza (table.setRowSelectionAllowed(true)), wstawiasz zmianę koloru w instrukcji if(isSelected). Następnie cały wiersz jest uważany za wybrany i koloruje wszystkie komórki w!

3 był wielki, ale jeśli ktoś wie # 1 czy może mi wyjaśnić dlaczego został tak zaprojektowany, że można zastosować mechanizm renderujący tylko do jednej kolumny naraz byłoby mile widziane.

Odpowiedz

5

Tutorial artykuł Concepts: Editors and Renderers wyjaśnia „pojedyncza komórka renderowania jest zwykle stosowany do opracowania wszystkie komórki, które zawierają ten sam typ danych” zwrócony przez getColumnClass() metody modelu.

Alternatywnie ręczne prepareRenderer(), który jest wywoływany przez wszystkich komórek, aby selektywnie zmieniać wyglądu Row. Ten example porównuje oba podejścia, a artykuł Table Row Rendering rozszerza się na wszechstronność podejścia.

0

W drugim pytaniu można wypróbować metody setSelectionBackground (Color) i setSelectionForeGround (Color). Nie jestem pewien, jak możesz rozwiązać pierwszy. I ostatnia sugestia, żebyś mógł skorzystać z wtyczki projektanta huśtawki takiej jak JBuilder. Pomogłoby to dużo.

+0

Dzięki za odpowiedzi. Próbowałem użyć setSelectionBackground (Color), ale Eclipse flaguje go jako nieistniejącą metodę. – Daniel

+0

Właściwie to wymyśliłem tę część, zredagowałem oryginalny post. – Daniel

+0

Próbowałem metody setSelectionBackGround teraz i to działa. Gdy wybiorę jeden lub więcej wierszy, ich kolory zostaną zmienione. Ale może rozumiem źle, czego szukasz. – mbaydar

12

zbyt bezpośredni prostu sumują linia

tablename.setSelectionBackground(Color.red); 

w moim przypadku

jtbillItems.setSelectionBackground(Color.red); 
+1

Tylko jeśli nie masz obiektu TableCellRenderer, który ustawia kolor tła. W takim przypadku musisz dodać 'if (! IsSelected) {setBackground (color1);}'. – FaithReaper

Powiązane problemy