look and feel - on mouse over, zmiana wygladu

0

Witam,
W tej chwili jest : Wstawiam przycisk (JButton), najezdzam kursorem myszki, przycisk zaznacza sie - pojawia sie niebieska ramka w srodku.
Chcialbym zeby bylo: JButton, najezdzam mysza, przycisk zaznacza sie - zmieniaja sie kolory wypelnienia gradientu ze standardowych niebiesko bialych na zdefiniowane przeze mnie.
Jak tego dokonac?
Wiem jak zmienic kolor wypelnienia gradientu, i widzialem gdzies jak zmienic ogolnie kolorystyke roznych czesci, typu kolor zaznaczenia. Ale nie wiem czy/jak da sie w look and feel'u zmienic zachowanie, tak zeby zamiast rysowania ramki, zmienil wypelnienie srodka przycisku. Googlowanie niewiele daje...

0

Za rysowanie odpowiedzialny jest obiekt UI, w przypadku guzika jest to obiekt implementujacy interfejs javax.swing.plaf.ButtonUI. Ma ona wiele podklad, jedna z nich jest np javax.swing.plaf.metal.MetalButtonUI. Zobacz w niej metode paintFocus() - ona jest odpowiedzialna za rysowanie guzika dla Metal gdy jest focus - jest wolana z klasy DefaultButtonUI.paint, ktora z kolei wola domyslnie JButton.paintCopmonent (a wlasciwie JComponent.paintComponent, jakos ze JButton nie nadpisuje tej metody). Zrob swoja podklase MetalaButtonUI i zmien rysowanie z focusem na takie jakie chcesz.
Teraz, JButton ma metode getClassUI() ktora zwraca Stringa o wartosci "ButtonUI". Jest to klucz w tak zwanej mapie UIDefaults, z ktorrej korzysta UIManager. Przykladowo, ten kod:

UIDefaults d = UIManager.getDefaults();
for (Map.Entry<Object, Object> entry : d.entrySet()) {
    System.out.println(entry.getKey() + " " + entry.getValue());
}

wypisze ci wszystkie elementy tablicy UIDefaults do aktualnie zainstalowanego L&F. Zauwaz ze jednym z kluczow jest "ButtonUI" i wskazuje na nazwe klasy: javax.swing.plaf.metal.MetalButtonUI (dla uruchomienia programu i uzycie domyslnego L&F). Musisz w jakis sposob podmienic ta nazwe klasy, aby UIManager tworzac ta tablice UIDefaults uzyl twojej, ze zmienionym rysowaniem. Masz kilka opcji:

  • zrobic podklase LookAndFeel i wrzucic w konstruktorze czy innej metodzie nazwe Twojej klasy do UIDefaults (zobacz metode MetalLookAndFeel.initClassDefaults jako przyklad)
  • wywolac na poczatku programu / przy zmianie L&F metode UIManager.getDefaults().put(JButton.getClassUI(), "moj.nowy.zielony.focusowy.Button");
    Teraz dla kazdego nowego guzika UIManager skonsultuje sie z tablica UIDefaults, pobierze nazwe Twojej klasy i guzik bedzie sie rysowal tak jak zdefiniowales dla Focusu. Zauwaz ze bedzie tak tylko dla 1 L&F, reszta bedzie nietknieta - dlatego wlasnie jest to takie zamotane.

Jest to tylko czubek gory lodowej jesli chodzi o PLaF, ale powinno pomoc. Po wiecej informacji polecam przeczytac//java.sun.com/products/jfc/tsc/articles/architecture/#pluggable (a najlepeij caly ten dokument - dla kogos kto ma zamiar pisac duzo ze Swingiem jest nieoceniony).
Pozdrawiam.

0

Dzieki :)

0

O jednym zapomnialem - Twoja wlasna klasa musi miec statyczna metode createUI() - po co ona jest przeycztasz pod sam koniec artykulu ktory podalem wczesniej: "Stateless vs. stateful delegates".

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