Starym sposobem – mnemoniki w Swingu (Java)

Dziś ponownie Java; dotarło do mnie, że Swing nie obsługuje znak & w nazwach menusów i przycisków do nich, mają na to osobną funkcję, lub też przeładowane konstruktory. Ma to kilka swoich plusów, ma też kilka minusów. Ot chciałem w prosty sposób dorobić w moim programie klawisze skrótów w menu, z tym, że oczywiście teksty samego menu, byłby wczytywane z klasy zasobów – tutaj nieco szerzej o tym – nie mogę z tego powodu wklepać ich na stałe.

Postanowiłem więc dorobić na szybko taką małą metodę, która dorabiała by “mnemonic” na podstawie samego tylko stringu (dzięki zastosowaniu znaku &).

public JMenuItem newMenuItem(String label) {
	JMenuItem resItem = null;
	int tmp = label.indexOf('&');
 
	// Sprawdzamy, czy w ogóle w etykietce jest zaznaczony klawisz skrótu.
	if (tmp > -1) {
		// usuwamy znak & przez podział stringu label wedłu znaku ktoruy chcemy usunąc
		String[] strArray = label.split('&', 2);
		// teraz sklejamy obie połówki, ako skrót określamy znak, stojący na prawo od &
		res = new JMenuItem(strArray[0] + strArray[1], label.charAt(tmp +1));
	}
	else
		res = new JMenuItem(label);
	return res;
}

Kod jak widzicie dość prowizoryczny, ale mi wystarczył. Jeśli ktoś ma jakieś 3 grosze do niego, zapraszam tu na dole można je wklepać.

17 thoughts on “Starym sposobem – mnemoniki w Swingu (Java)

  1. A jeszcze lepiej np. wyrażeń regularnych – np. w Perlu (nie wiem jak w Javie, nie znam, ale zapewnie podobnie) by to leciało:

    $cus = ‘Du&pa jasia’;
    $cus =~ m/(.*)&(.)(.*)/; # regular expression matching
    print "label: $1$2$3 \n"; # prints: "label: Dupa jasia"
    print "mnemonic: $2 \n"; # prints: "mnemonic: p"

    Like

  2. @mina86: dziękuję, poprawię – nie we wpisie;) tylko w programie – tutaj zostawię w celach dydaktycznych:P@paweł ciupaK: niezły pomysł, ale tutaj chyba jest nieco optymalniej, wyrażenia regularne w Javie wymagają użycia klasy przechowującej wzorzec itp. – w sumie jest z tym nieco zabawy.

    Like

  3. Dla pewnych definicji słowa "lepiej" wyrażenie regularne pewnie będzie rzeczywiście lepsze. Nie sądzę jednak, aby było np. szybsze — nie w przypadku, gdy chcemy wyszukać pojedyncza literkę..

    Like

  4. ja mam tak zrobione, że wszystkie mnemonicsy w menu oraz w oknach dialogowych tworzą się automagicznie (lenistwo :P) Tzn. przy pierwszym wyświetleniu okna/menu, wszystkie jego komponenty są przeglądane i sprawdzane, czy należy wstawić tam skrót. Dodatkowo pomijane są znaki "gijlpqrtyIQ", które są nieczytelne z podkreśleniem, lub samo podkreślenie jest prawie niewidoczne. Oczywiście nie wszędzie da się automatycznie dodać skrót, bo np. menu Pomoc jako standard musi mieć skrót Alt+C, itp..

    Like

  5. @Sigvatr: Nie wiem, na Javie się nie znam, ale może faktycznie pod tym względem optymalniej jest tak – i dlatego właśnie nie lubię jezyków które są obiektowe więcej, niż to potrzeba…

    Like

  6. Wyrażenie regularne będzie praktycznie zawsze efektywniejsze. Nawet dla pojedynczej literki. Zakładając oczywiście, że regexpa mamy w skompilowanej już formie (czyli nie tworzymy nowego obiektu za każdym wywołaniem metody).

    Zresztą chyba część operacji na Stringach i tak używa pod spodem regexpów.

    Like

  7. (inna sprawa, że regexpy nie są nigdy tak czytelne jak prostsze konstrukcje, więc jeśli da się coś zrobić w dwóch-trzech wierszach używając metod z klasy String i nie trzeba przy tym walczyć o każdą milisekundę, to osobne obiekty regexpów sobie odpuszczam)

    Like

  8. Dla pojedynczego znaku wyrazenie regularne na pewno nigdy nie bedzie szybsze od prostego strchr() chociazby z tego prostego powodu, ze jakby nie kombinowac, to wyrazenie regularne musi wykonac funkcje strchr() lub jakas operacje do tej funkcji analogiczna czyli na pewno jest nieszybsze niz strchr(). Koniec dowodu.

    Like

  9. True. Nie doczytałem, że mina86 redukuje problem do wyszukania pozycji znaku w stringu i myślałem cały czas o czymś bardziej złożonym (search/replace przynajmniej). Zafiksowałem się na tym konkretnym przykładzie i nie doczytałem.

    Like

  10. Tak nawiasem, ostatnio, trzeba przyznać, lepiej pojąłem istotę wyrażeń regularnych (w takiej konwencji Perlowej).No ale Javę ciężko porównywać do języka skryptowego mimo wszystko – inny obszar zastosowań.

    Like

  11. A to język ma jakieś znaczenie? Zawsze mi się wydawało, że regexp to regexp. Jedyne na co trzeba uważać, to dialekt RE (czyli które znaki eskejpować, a które nie).

    Obszar zastosowań fakt, inny, ale regexpy do tego samego się stosuje 🙂

    Like

  12. Po prostu używa się ich w miejscach, gdzie pasują.Tam gdzie można ich uniknąć to używa się np.: wbudowanych w klasę string funkcji.

    Like

Comments are closed.