Blog

Java – Alias Super, Dziedziczenie i Polimorfizm na przykładzie JTable

Dziedziczenie – Polimorfizm. Dwa egzotycznie brzmiące pojęcia niosące za sobą sporą dawkę możliwości do generowania bardzo ciekawych efektów wizualnych. Dziś postaram się zaprezentować jak to działa w praktyce a także, dlaczego warto tego używać. Na początek zaprezentuję fragment kodu, który następnie bardzo szczegółowo omówię.

ZOBACZ KOD PROGRAMU

class MyTableCellRendererK extends DefaultTableCellRenderer{
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col){
            setBackground(null);
            Color k_wynajmuje = new Color(250,200,0);
            Color kolor2 = new Color(0,130,130);
                                                                                // super (alias) odnosi sie do klasy rozszerzonej uzyskujac pelna funkcjonalnosc tej klasy 
            super.setHorizontalAlignment(JLabel.CENTER);                        // na poziomie extend dzieki temu mozna np. ustawic wyrownanie rekordow po modyfikacji przez
                                                                                // klase rozszerzajaca
            Component c = super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,col);
                if(t_klienci.getValueAt(row, 7).equals("1")){
                    c.setBackground(k_wynajmuje);
                }
                if(isSelected & t_klienci.getValueAt(row, 7).equals("1")){
                    JLabel a = (JLabel)super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,col);
                    return a;
                }
                setText(value !=null ? value.toString() : "");
                return c;
        }
    }

Linia pierwsza: Informuje kompilator o stworzeniu przez nas klasy o nazwie ‘MyTableCellRendererK’, która stanowi rozszerzenie klasy wbudowanej (podstawowej). Po co w ogóle to robić? Klasa wbudowana zawiera pewien zbiór dostępnych funkcjonalności, na podstawie których możemy modyfikować dany element SWING. Może zdarzyć się sytuacja, że te funkcjonalności są nie wystarczające i potrzebujemy doposażyć klasę podstawową o własne metody. Tworzymy więc własną klasę informując kompilator, że jest to rozszerzenie klasy już istniejącej – ‘extends DefaultTableCellRenderer’.

@Override – określenie to oznacza, że zmieniamy zachowania metod wcześniej zdefiniowanych (oryginalnych) przystosowując je do własnych potrzeb.
Kolejna linia tuż pod @Override pokazuje, z jakich dostępnych elementów i eventów odnoszących się do JTable możemy skorzystać. Są to kolejno Tabela, wartość w tabeli, zaznaczony rekord, fokus, id rekordu, id kolumny.
Następnie do celów eksperymentalnych definiujemy wartości dwóch kolorów. Definicja new Color może również przyjąć 4 a nie trzy parametry. Czwarty parametr oznacza gradient danego koloru. Mówiąc prościej przeźroczystość.
Tą linię pozwolę sobie na chwilę pominąć. Zajmiemy się nią na końcu.
Następnie używając dyrektywy Component przypisujemy do zmiennej ‘c’ ten element wcześniej wygenerowanej tabeli, który nas interesuje wykorzystując możliwości klasy nadrzędnej.
Następnie za pośrednictwem pierwszego warunku if sprawdzamy czy wartość 7 kolumny każdego rekordu tabeli t_klienci na etapie jej renderowania zawiera 1? Jeżeli tak to zmieniamy kolor całego rekordu na wcześniej zdefiniowany.
Kolejny warunek if działa w sposób analogiczny do poprzedniego z tą różnicą, że uaktywnia się dopiero w sytuacji, gdy dany rekord został wybrany przez użytkownika poprzez kliknięcie. A informuje nas o tym dyrektywa ‘isSelected’.
Na samym końcu zwracamy oczywiście ‘przeparsowany’ przez naszą klasę rozszerzającą rekord do oryginalnego widoku tabeli poprzez return c – zwróć dany element.

Interesującą kwestią, która już na etapie pisania może zastanawiać to fakt, że nie można w sposób bezpośredni odnieść się do żadnej metody klasy nadrzędnej. A często to właśnie chcemy zrobić. Połączyć podstawową, oryginalną funkcjonalność z elementami, które sami stworzyliśmy. W tym miejscu z pomocą przychodzi nam alias super.
super.setHorizontalAlignment(JLabel.CENTER); –> dzięki tej linii kodu justujemy wszystkie dane w kolumnach. Bez użycia odnośnika typu alias do klasy macierzystej nie moglibyśmy skorzystać z tej jakże przyjemnej dla oka funkcjonalności.

Na koniec zapewne przydałoby się pokazać w jaki sposób już tak przygotowaną klasę można wykorzystać w praktyce. Otóż w poprzednim wpisie, gdzie pokazałem jak generuje się i wypełnia danymi tabele należy umieścić kilka linijek dodatkowego kodu. Oto i on:

ZOBACZ KOD PROGRAMU

...
 Enumeration<TableColumn> en = t_klienci.getColumnModel().getColumns();
 while (en.hasMoreElements()) {
 TableColumn tc = en.nextElement();
 tc.setCellRenderer(new MyTableCellRendererK());
 }

Jak nie trudno zauważyć tworzymy iterator przechodzący przez wszystkie rekordy tabeli. Pętla while informuje nas, że dopóki w tabeli znajdują się jescze rekordy to ma pracować dalej przechodząc do kolejnego zaraz po wykonaniu metody setCellRenderer, która jako parametr ma zdefiniowaną nazwę naszej klasy. Uogólniając, dopóki w tabeli występują rekordy to poddawaj je obróbce przez stworzoną przez nas klasę.

Pozdrawiam.

  • Data Wpisu Grudzień 14, 2014 - 6:47 pm
  • Utworzył Azura
  • Kategoria

Brak komentarzy.

Skomentuj



Wszelki prawa zastrzeżone przez CordaSystems