2011-07-28 12 views
8

Mam podstawowy JTable i wymaganie jest takie, że po kliknięciu na dowolną komórkę cały wiersz powinien być podświetlony, a także, że kliknięta komórka powinna mieć inny kolor niż reszta zaznaczonego wiersza.Swing JTable - Zaznacz wybraną komórkę w innym kolorze niż reszta wybranego rzędu?

Obecnie mam isRowSelectionAllowed jak prawda

Próbowałem przy użyciu niestandardowego TableCellRenderer brzmi następująco:

public class CustomTableCellRenderer extends DefaultTableCellRenderer 
{ 

public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer(); 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

    if (isSelected) { 
     c.setBackground(Color.red); 
    } 
    else { 
     c.setForeground(Color.black); 
     c.setBackground(Color.white); 
    } 
    return c; 
    }  
} 

Ale to nie wydają się działać (cały wiersz był zaznaczone na czerwono).

Próbowałem również ustawienie właściwości UIManager następująco:

UIManager.put("Table.focusCellBackground", 
     new javax.swing.plaf.ColorUIResource (Color.red)); 

Ale to nie wydają się działać albo (choć, gdy próbowałem wyznaczając granicę korzystając

UIManager.put("Table.focusCellHighlightBorder", 
     new BorderUIResource.LineBorderUIResource(Color.red)); 

że działa dobrze)

Czy możesz podać sugestie, co mogę zrobić?

Odpowiedz

10

Spróbuj:

jtable.setCellSelectionEnabled(true); 

następnie w getTableCellRendererComponent

if (table.isCellSelected(row, column)) 
    setForeground(Color.red); 
else if (table.isRowSelected(row)) 
    setForeground(Color.green); 
else if (table.isColumnSelected(column)) 
    setForeground(Color.blue); 
else 
    setForeground(Color.black); 

To spowoduje, wybraną komórkę na czerwono, resztę rzędu na zielono, i resztę w kolumnie na niebiesko . Uwaga: wybór komórki wymaga pojedynczego modelu wyboru, inne modele wyboru mogą powodować nieprzewidywalne zachowania.

+0

Próbowałem tego, ale to wcale nie zmienia koloru. Przechodzi do warunku if dla 'isCellSelected' i' isRowSelected', ale nie robi nic. –

+0

Przepraszam, mój błąd - próbowałem, a to działa. Wielkie dzięki. (Ustawienie jako zaakceptowanej odpowiedzi z powodu działającego kodu, inne odpowiedzi również były pomocne w nauce). –

3

Konieczne będzie wyłączenie wyboru wierszy i wybór komórki dla tabeli. Następnie znajdź sposób, aby wrócić i zaznaczyć wiersz, jeśli to konieczne.

+0

Masz na myśli, że włączam CellSelectionEnabled (true), a następnie obsługuję wybór wiersza używając czegoś podobnego? table.changeSelection (row, col, toggle, extend); ? To daje taki sam rezultat. –

+0

Tak, do pierwszej części, nie do drugiej. Będziesz potrzebował Renderera komórek, który podświetli wybrany wiersz w innym kolorze niż wybrana komórka. – jzd

+0

Postaram się powiedzieć. –

4

Ale to nie zadziałało (cały rząd został podświetlony na czerwono).

Należy sprawdzić zmienną "hasFocus", a nie zmienną "isSelected".

Inną opcją, zamiast tworzyć wielowykładne renderery niestandardowe (w przypadku, gdy tabela zawiera kolumny różnych typów klas), jest użycie podejścia Table Row Renderering.

Powiązane problemy