[swing] Kolorowa ramka/tło w obiektach JTextComponent z ustawionym focusem.
Filip Sielimowicz - 11-01-2006 09:13
[swing] Kolorowa ramka/tło w obiektach JTextComponent z ustawionym focusem.
Jak się poprzyglądać różnym look&feel'om to łatwo zauważyć, że w większości ustawienie focusa na pole tekstowe nie powoduje żadnych dodatkowych efektów. Zaś ustawienie focusa na radiobuttona, comboboxa, checkboxa itp. generalnie powoduje zmianę koloru ramki komponentu.
Mnie zaś interesuje kwestia: jak podświetlić ramkę także w komponentach tekstowych lub nawet na czas focusa zmieniać im tło.
Generalnie rozważam kilka wyjść, ale tylko jedno wydaje mi się właściwe: własny look&feel oparty na np. JGoodies (a tam też niestety mimo wielu możliwości - textfieldy nie są kolorowane).
Czy ktoś jest w stanie przybliżyć mi ilość pracy ? W look&feel'u generalnie prawie nic do tej pory nie robiłem, wiec nie wiem, czy po wejściu w temat szybko takie coś będę w stanie sobie dorobić.
A jakby ktoś jeszcze dał naprowadzajacy kawałek kodu, to już w ogóle byłoby wyśmienicie ... ;)
Zbyszek Malec - 11-01-2006 09:13
Filip Sielimowicz wrote (tak! stara dobra wrotka!):
> Mnie zaś interesuje kwestia: jak podświetlić ramkę także w komponentach > tekstowych lub nawet na czas focusa zmieniać im tło.
A czy zastosowanie FocusListener'ów nie będzie odpowiednie? Ewentualnie możesz też napisać własne pole tekstowe, które to będzie miało zaimplementowane i jego uzywać. Nie musisz od razu pisać całego L&F (no chyba że chcesz ;) ).
-- Zbigniew Malec Ustronie:104 gg:2756100
Filip Sielimowicz - 11-01-2006 09:14
=?iso-8859-2?Q?Re:_=5Bswing=5D_Kolorowa_ramka/t=B3o_w_obiektach_JTextComp?==?iso-8859-2?Q?onent_z_ustawionym__focusem.?= Użytkownik "Zbyszek Malec" <zbyszekto@tlen.pl> napisał w wiadomości news:sqj90rydqviy$.qdjwnrmndhqq$.dlg@40tude.net... > Filip Sielimowicz wrote (tak! stara dobra wrotka!): > >> Mnie zaś interesuje kwestia: jak podświetlić ramkę także w komponentach >> tekstowych lub nawet na czas focusa zmieniać im tło. > > A czy zastosowanie FocusListener'ów nie będzie odpowiednie? Ewentualnie > możesz też napisać własne pole tekstowe, które to będzie miało > zaimplementowane i jego uzywać. Nie musisz od razu pisać całego L&F (no > chyba że chcesz ;) ).
Problem podstawowy to to, że są już setki formatek gotowych, a ja chciałbym by zmiana była możliwie nieinwazyjna. Z założenia nie tworzymy własnych wrapperow do komponentów, żeby jak najmniej odbiegać od tego, co jest dostępne standardowo. Wszelakie dodatkowe ficzery staramy się dodawać dynamicznie.
Stąd do rozważenia jest propozycja podpinania FocusListener'ów, bo i tak każda formatka zanim jest wyświetlana to podlega obróbce, mamy gotowe i sprawdzone funkcje, które mi taką formatkę przejrzą komponent po komponencie - więc tam z tymi listenerami mógłbym się wpiąć.
Ale wolałbym jeśli to możliwe zrobić to czysto look&feel'em. Na razie przyglądam się bliżej kilku wątkom, które widać poniżej, np jeden ma w tytule getUI().
Nikt nie mówi o pisaniu L&F od nowa ... ;) Liczę na to, że wystarczy, iż wydziedziczę nowy L&F po tym, który używamy (PlasticXPLookAndFeel). Na razie patrzę co wynika z pokrycia metody
public UIDefaults getDefaults();
Zrobiłem na razie tak: @Override public UIDefaults getDefaults() { System.err.println("YYYYYYYYYYY getDefaults"); // return super.getDefaults(); UIDefaults uid = new UIDefaults() { @Override public Object get(Object key) { System.err.println("UID get: '" + key + "'"); return super.get(key); }
@Override public Object get(Object key, Locale l) { System.err.println("UID get: '" + key + "', locale:"+l); return super.get(key, l); }
@Override public Color getColor(Object key) { System.err.println("UID getColor: '" + key); return super.getColor(key); }
@Override public Color getColor(Object key, Locale l) { System.err.println("UID getColor: '" + key + "', locale:"+l); return super.getColor(key, l); } }; return uid; }
.... i sobie podglądam, czy coś z tego wynika ...
-- Filip Sielimowicz http://panda.bg.univ.gda.pl/~sielim/fractal/index.htm
Filip Sielimowicz - 11-01-2006 09:14
=?iso-8859-2?Q?Re:_=5Bswing=5D_Kolorowa_ramka/t=B3o_w_obiektach_JTextComp?==?iso-8859-2?Q?onent_z_ustawionym__focusem.?= Użytkownik "Filip Sielimowicz" <sielim@poczta.onet.pl> napisał w wiadomości news:dpttsk$p19$1@news.onet.pl... > Jak się poprzyglądać różnym look&feel'om to łatwo zauważyć, że > w większości ustawienie focusa na pole tekstowe nie powoduje żadnych > dodatkowych efektów. Zaś ustawienie focusa na radiobuttona, comboboxa, > checkboxa itp. generalnie powoduje zmianę koloru ramki komponentu. > > Mnie zaś interesuje kwestia: jak podświetlić ramkę także w komponentach > tekstowych lub nawet na czas focusa zmieniać im tło. > > Generalnie rozważam kilka wyjść, ale tylko jedno wydaje mi > się właściwe: własny look&feel oparty na np. JGoodies (a tam > też niestety mimo wielu możliwości - textfieldy nie są kolorowane). > > Czy ktoś jest w stanie przybliżyć mi ilość pracy ? > W look&feel'u generalnie prawie nic do tej pory nie robiłem, > wiec nie wiem, czy po wejściu w temat szybko takie coś będę > w stanie sobie dorobić. > > A jakby ktoś jeszcze dał naprowadzajacy kawałek kodu, to już w ogóle > byłoby wyśmienicie ... ;)
Więc wygląda to mniej wiecej tak:
/** Komponent UI do obsługi text fieldów - rozwinięty * o focusowanie i walidację * @author filip */ public static class MyTextFieldUI extends BasicTextFieldUI {
public static ComponentUI createUI(JComponent c) { return new MyTextFieldUI(); }
@Override public void installUI(final JComponent c) { //System.err.println("InstallUI("+c+")"); super.installUI(c); updateBorder(c); if (c instanceof JTextField) { c.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) { updateBorder(c); }
public void focusLost(FocusEvent e) { updateBorder(c); }
}); } }
static private Border boNormal = new LineBorder(Color.gray); static private Border boError = new LineBorder(Color.red); static private Border boWarning = new LineBorder(Color.yellow); static private Border miFocused=new LineBorder(PlasticXPLookAndFeel.getFocusColor(), 2); static private Border miNormal = new EmptyBorder(2,2,2,0); static private Border boNormalmiNormal = new CompoundBorder(boNormal, miNormal); public void updateBorder(JComponent c) { Integer err=(Integer)c.getClientProperty("validationError" ); if (err==null) err=Error.NONE; if (err == Error.NONE && !c.isFocusOwner()) { if (c.getBorder()!=boNormalmiNormal) c.setBorder(boNormalmiNormal); } else { Border borderOut = boNormal; Border marginIn = miNormal; if (err == Error.ERROR) borderOut = boError; else if (err == Error.WARNING) borderOut = boWarning;
if (c.isFocusOwner()) { marginIn = miFocused; } c.setBorder(new CompoundBorder(borderOut, marginIn)); } } }
...
LookAndFeel look = null; look = new PlasticXPLookAndFeel(); javax.swing.UIManager.setLookAndFeel(look); PlasticXPLookAndFeel.setMyCurrentTheme(new SkyGreen());
UIManager.put("TextFieldUI", MyTextFieldUI.class.getName()); UIManager.put("FormattedTextFieldUI", MyTextFieldUI.class.getName());
No i działa. Dodatkowo, jak widać, badamy client property "validationError". Jak wrzucimy komponentowi Error.ERROR to nam będzie go obwijał czerwoną obwódką. (robimy np.
JTextField txt; .... txt.putClientProperty("validationError", Error.ERROR); txt.updateUI();
-- Filip Sielimowicz http://panda.bg.univ.gda.pl/~sielim/fractal/index.htm
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Django - newforms, DateField=?iso-8859-2?Q?domy=B6lna_warto=B6=E6?= ustawiona na=?iso-8859-2?Q?'dzi=B6'?=
[Oracle, Toad] Zaladowanie obiektu w TOAD
[MSSQL 2K] =?ISO-8859-2?Q?Wp=B3yw_ustawie=F1_regionalnych_?==?ISO-8859-2?Q?serwera_na_zapytania?=
=?iso-8859-2?Q?mo=BFliwo=B6=E6_kupienia_zestaw=F3w_obiekt=F3w _ro=B6lin?=
=?ISO-8859-2?Q?Jak_sprawdzi=E6_czy_obiekt_zosta=B3_utowrzony= 3F?=
corel... jak spłaszczyć obiekt z jego obrysem aby stanowiło jedną całość
jak naniesc na obraz skale pokazujaca rzeczywisty rozmiar sfotografowanego obiektu
[sybase] Jak w sprawdzić strukturę obiektu (tabeli) w Interactive SQL ???
wyrownanie obiektu wzgledem innego w PS - czy jest taki skrot?
Obiektowy PL/SQL - problem z typem REF
zanotowane.pldoc.pisz.plpdf.pisz.plabsolwenci.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|