[JTable] zmiana koloru wiersza/komorki po spełnieniu warunku

0

Witam, mam problem z "oznaczeniem" (np zmiana tła) wiersza tabeli (badź jednej komórki), gdy wartość komórki (pobranej z bazy) spełnia dany warunek np. data_w_komorce.before(teraz) - z Gregorian Calendar.
Moja tabela ma kilka kolumn, z czego jedna to data. chcialbym sprawdzac czy data nie jest "przed" dniem dzisiejszym i jeśli tak oznaczyć ją np zmianą tła. Utworzylem juz sobie obiekty teraz i dataZBazy - obydwa GregorianCalendar i gdy wywołam w programie

 if (pobranaDataB.before(teraz)) 
{
System.out.println("\nBaza: "+dataBAZA);
System.out.println("Teraz: "+dataNow);
}

to wszystko się wyświetla jak należy, ale jak zrobić, by "podświetliło" mi automatycznie każdą komórkę spełniającą ten warunek w JTable?

Przeszukiwałem internet i czytalem w wielu tutorialach, że chodzi tu o renderowanie komórki, ale za diabła nie wiem jak spowodować, by dany renderer "zadziałał' na wiersz, tylko po spełnieniu jakiegoś tam warunku (w moim przypadku x.before(y) ). Czy ktoś rozwiązywał już może podobny problem ?

pozdrawiam,
Piotr

0

jśli się nie mylę chodzi Ci o to:
http://forum.java.sun.com/thread.jspa?threadID=560578&tstart=75

no tylko że musisz mieć raczej tabele opartą na modelu a nie na tablicy

pzdr.

0

dzięki ;] na stronie którą podesłałeś był link do posta przedstawiającego rozwiązanie problemu bez tworzenia dodatkowych rendererów. Działa bez zarzutu [soczek]
dzięki,
pozdr

0

a jednak :/ nie chwal dnia...
wszystko działa fajnie, ale niestety gdy posortuje sobie tabele podświetlone zostają wiersze o pozycji (row,column) przed sortowaniem :/

        tabelaL = new JTable(modelL) {

            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
            
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                if (!c.getBackground().equals(getSelectionBackground())) {
                    String wartoscKomorki = (String)getModel().getValueAt(row, 6);
                    try {
                        java.util.Date dataZBazy =  formater.parse(wartoscKomorki);
                        pobranaDataB.setTime(dataZBazy);

                        c.setBackground( pobranaDataB.before(teraz) ? Color.LIGHT_GRAY : Color.white );
                    } catch (ParseException ex) {
                        ex.printStackTrace();
                    }
                }
                return c;
            }
        };

        tabelaL.setAutoCreateRowSorter(true);

Macie może jakieś pomysły ? Nie za bardzo mi szło z tworzeniem renderera, a w tym rozwiązaniu wszystko jest ok, póki nie posortuje sobie tabeli :/

pozdrawiam,
Piotr

0

dowiąż sobie jakąś flagę do komórki. niech w trakcie sortowania idzie ona za komórką. To tak na szybko.

0

ok, problem rozwiązany :]
musiałem użyć convertRowIndexToModel() i convertColumnIndexToModel() by zmienic wartosci w modelu, nie tylko w widoku.

        tabelaL = new JTable(modelL) {
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                int r = tabelaL.convertRowIndexToModel(row);
                int cl = tabelaL.convertColumnIndexToModel(column);
                if (!c.getBackground().equals(getSelectionBackground())) {
                    String wartoscKomorki = (String)getModel().getValueAt(r, 6);
                    try {
                        java.util.Date dataZBazy =  formater.parse(wartoscKomorki);
                        pobranaDataB.setTime(dataZBazy);
                        c.setBackground( pobranaDataB.before(teraz) ? Color.LIGHT_GRAY : Color.white );
                    } catch (ParseException ex) {
                        ex.printStackTrace();
                    }
                }
                return c;
            }
        };

Dzięki za pomoc,
pozdr

1 użytkowników online, w tym zalogowanych: 0, gości: 1