Uniwersytet Łódzki
Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej
Swing Java
Wykład 8
mgr inż. Michał Misiak
Plan wykładu
Look and Feel
Rozszerzenia Java Swing
Wykorzystanie map w aplikacjach
Netbeans 6.0
Google Android
Możliwości Java Swing
Aplikacja z Java Sun Tutorial
prezentująca możliwości Java Swing. Aplikacja zawiera kod dzięki czemu można podejrzeć wykonanie poszczególnych elementów.
Źródło: Java Web Start: http://java.sun.com/products/jfc/jws/SwingSet2.jnlp
Look and Feel
Możliwość definiowania wyglądu i zachowania aplikacji niezależnie od platformy
Użycie l’n’f pozwala skupić się programiście na logice aplikacji oferując zbiór różnych wyglądów
Swing pozwala na stosowanie l’n’f dzięki podzieleniu JComponent na dwie cześci:
podklasa JComponent
i powiązana klasa ComponentUI.
ComponentUI jest rzadko używany przez programistów i
standardowo jest dziedziczony z JComponent. Odrysowanie komponentu delegowane jest do UI.
Przygotowanie l’n’f wiąże się z implementacją dla każdego
komponentu Swing odpowiedniej delegaty UI. Np. dla JTabbedPane jest delegata: MetalTabbedPaneUI
Look and Feel (2)
CrossPlatformLookAndFeel – jest to "Java L&F" zwany również
„Metal”. Wygląda tak samo na wszystkich platformach. Jest to cześć Java API (javax.swing.plaf.metal) i jest standardowo ustawiany w przypadku braku wyboru innych preferencji.
Systemowy LookAndFeel – aplikacja używa natywnego L&F dla systemu, na którym jest uruchomiona. Systemowy L&F jest
określany w momencie uruchomienia aplikacji.
Synth – jest to bazowy L&F do tworzenia własnych L&F z wykorzystaniem XML
Multiplexing – L&F, który składa się z wielu L&F przypisanych różnym komponentom w tym samym czasie.
Ustawianie L&F
Ustawienie L&F powinno się odbywać jako pierwsze
W momencie tworzenie danego komponentu, komponent pyta się UI manager o delegatę L&F, która implementuje wygląd komponentu
Ustawienie L&F realizowane jest w następującej metodzie:
UIManager.setLookAndFeel()
L&F może być również wyspecyfikowany w linii poleceń przy uruchamianiu programu:
ava -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel MyApp
Zmiana L&F. Powinna zostać wywołana poniższa metoda na jednym z tzw. top-level komponentów:
UIManager.setLookAndFeel(lnfName);
SwingUtilities.updateComponentTreeUI(frame);
frame.pack();
Tematy w L&F
Tematy pozwalają w łatwy sposób
modyfikować kolory oraz czcionki L&F.
Np. dla L&F Metal można wybrać następujące tematy:
DefaultMetal,
Ocean,
Test
Synth Look and Feel
Modyfikacja istniejących L&F lub pisanie własnego jest trudnym zadaniem
Do łatwego tworzenia własnych L&F może być użyty pakiet javax.swing.plaf.synth
L&F może być tworzony po przez programowanie lub w pliku XML
Z synth tworzony jest de facto wygląd, natomiast
zachowanie nadaje synth
Przykład modyfikacji synth
Synth dostarcza
wszystkie ComponentUI
Programista ma określić wyłączenie w jaki sposób komponent jest rysowany
Synth operuje na
poziomie niższym niż komponent na poziomie tzw. „regionów”
Źródło: http://java.sun.com/docs/books/tutorial/uiswing/lookandfeel/synth.html
SynthLookAndFeel laf = new SynthLookAndFeel();
laf.load(MyClass.class.getResourceAsStream("laf.xml"), MyClass.class);
UIManager.setLookAndFeel(laf);
Przykład: Rozkład Regionów dla JScroll
Modyfikacja Synth w XML i w programie
class MojaFabrStylow extends SynthStyleFactory {
public SynthStyle getStyle(JComponent c, Region id) { if (id == Region.BUTTON) {
return buttonStyle;
} else if (id == Region.TREE) { return treeStyle;
} return defaultStyle;
} }
SynthLookAndFeel laf = new SynthLookAndFeel();
UIManager.setLookAndFeel(laf);
SynthLookAndFeel.setStyleFactory(new MyStyleFactory());
<synth>
<style id="basicStyle">
<font name="Verdana" size="16"/>
<state>
<color value="WHITE" type="BACKGROUND"/>
<color value="BLACK" type="FOREGROUND"/>
</state>
</style>
<bind style="basicStyle" type="region" key=".*"/>
</synth>
W pliku XML W kodzie programu
Uwaga! Więcej na temat tworzenia własnych L&F z Synth pod linkiem:
http://java.sun.com/docs/books/tutorial/uiswing/lookandfeel/synth.html
Zaawansowane l’n’f: substance
Przykładowy l’n’f: Substance. Źródło: https://substance.dev.java.net/
Inne funkcjonalności Java Swing
Desktop – możliwa interakcję aplikacji ze standardowymi aplikacjami skojarzonymi ze specyficznymi typami plików na komputerze, na którym została ona uruchomiona
Actions – możliwość koordynacji stanu i obsługi zdarzeń dla większej liczby komponentów generujących zdarzenia actions.
Timer – możliwość implementacji wątku, który wykonuje akację cyklicznie z jakimś opóźnieniem
Focus – możliwość personalizacji sposobu ustawiania fokusu w aplikacjach w celu dokonania specyficznego przejścia po polach, walidacji, etc…
Key Bindings – możliwość ustawienia sposobu reakcji na klawiaturę
Wykorzystanie System Tray
Integracja z aplikacjami
Java 6 umożliwia integrację z aplikacji Javy z aplikacjami natywnymi uwzględniając aspekt wydajności
Integracja realizowana jest po przez Java Desktop API
(java.awt.Desktop). Dekstop API wyrosło z projektu JDesktop Integration Components (JDIC)
Funkcjonalność oferowana przez Java Desktop API
Uruchamianie specyficznej dla systemu przeglądarki ze wskazanym URL
Uruchamianie standardowego klienta poczty elektronicznej
Uruchamianie aplikacji w celu otwarcia, edycji, wydrukowania plików skojarzonych z tymi aplikacjami
Dostępność Desktop API: isDesktopSupported()
Jeśli Dekstop API wspierane można pobrać obiekt Desktop:
getDesktop()
Java Desktop API
Akcje które mogą być realizowane przez Java Dekstop API:
BROWSE
OPEN
EDIT
Różne aplikacje mogą być
zarejestrowane dla powyższych akcji
Obsługa akcji BROWSE
private void onLaunchBrowser(ActionEvent evt) { URI uri = null;
try {
uri = new URI(txtBrowserURI.getText());
desktop.browse(uri);
} catch(IOException ioe) { //TO DO Exception
}catch(URISyntaxException use) {
Źródło: http://java.sun.com/docs/books/tutorial/uiswing/misc/desktop.html
System Tray
System Tray – obszar w którym mogą być uruchamiane aplikacje. Obszar ten jest przez nie współdzielony Np. w Windows jest to System Tray odnosi się do paska, a w GNOME rozumiany jest jak obszar powiadomień
(notification area).
System Tray wprowadzony w Java 6 obsługiwany przez pakiet java.awt.SystemTray
dostęp do System Tray po przez metodę:
SystemTray.getSystemTray()
Zalecane wywołanie metody isSupported()
Dodawanie/Usuwanie ikon do Tray:
add(java.awt.TrayIcon)
System Tray (2)
Możliwość wyświetlenia:
podpowiedzi (Text ToolTip)
pop-up menu
dymku z wiadomością
Dostępny jest szereg nasłuchiwaczy i zdarzeń generowanych dla myszki
Część zdarzeń wykonywana jest samoczynnie.
kliknięcie na ikonę powoduje rozwinięcie pop-up menu.
podwójne kliknięcie powoduje wygenerowanie zdarzenia ActionEvent
final PopupMenu pop-up = new PopupMenu();
final TrayIcon trayIcon = new TrayIcon(
createImage(„ikona.gif", „ikona z tray"));
final SystemTray tray =
SystemTray.getSystemTray();
//tworznie menu
MenuItem Item1 = new MenuItem(„O aplikacji");
pop-up.add(Item1)
trayIcon.setPopupMenu(pop-up);
Splash Screen
Jest to ekran pojawiający się przeważnie w następujących sytuacjach:
Wskazanie, że aplikacja uruchamia się
Prezentacja informacji, która powinna być wyświetlona jednokrotnie
Ze względu na cel w jakim stworzono Splash Screen opóźnienie związane z jego uruchomieniem powinno być minimalne, ale za nim zostanie wyświetlony wymagane jest uruchomienie JVM,
załadowanie Swing i AWT
Java 6 pozwala na wyświetlenie SS za nim zostanie uruchomiona JVM
Możliwość wyświetlenia obrazu w formacie: gif, jpg, png z przeźroczystością i animacją
Splash Screen
Obsługa Splash Screen
Funkcjonalność oferowana w klasie SplashScreen:
Zamknięcie ekranu
Zmiana wyświetlanej grafiki
Uzyskanie pozycji i wielkości obrazu
Rysowanie na SS
Brak możliwości utworzenia instancji obiektu przez
aplikację. Uzyskanie dostępu do SS po przez metodę:
getSplashScreen()
final SplashScreen splash =
SplashScreen.getSplashScreen();
if (splash == null) { System.out.println(
"SplashScreen.getSplashScreen()"
+ " zwrocil null");
return;
}
Graphics2D g = splash.createGraphics();
if (g == null) {
System.out.println("g is null");
return;
}
Wykorzystanie map w aplikacjach
Wzbogacenie aplikacji o przetwarzanie danych geograficznych
Popularyzacja Google Maps w technice AJAX
Mapy w Swing – projekt open source o nazwie JXMapViewer rozwijany w Swinglabs
(http://www.swinglabs.org/)
Organizacje dostarczające mapy:
NASA's Blue Marble satellite
(http://earthobservatory.nasa.gov/Newsroom/BlueMarble/)
OpenStreetMap.org (http://www.openstreetmap.org/)
Budowa i użycie JXMapViewer
JXMapViewer jest to JPanel, który wie jak załadować mapy z serwera z obrazami, jak łączyć obrazy,
przekształcać współrzędne geograficzne, etc …
JXMapViewer znajduje się w wersji 6 Netbeans.
Netbeans 6 dostarcza również kilka nowych
funkcjonalności ułatwiających tworzenie takiej aplikacji.
Bardziej rozbudowaną funkcjonalność posiada JXMapKit (suwaki do manipulowania mapą)
JXMapKit posiada zestaw Properties pozwalający na modyfikację poszczególnych elementów (suwaki,
podgląd mapy, etc…)
Użycie JXMapKit
Modyfikacja lokalizacji – przesuwanie mapy:
setAddressLocation()
Przykład ustawienia lokalizacja na Łódź:
jXMapKit1.setAddressLocation(ne w GeoPosition(41.881944,-
87.627778));
GeoPosition przyjmuje jako parametr wartości szerokości i wysokości geograficznej
Pobranie określonej lokalizacji na mapie przy pomocy metody:
getCenterPosition()
public void addWaypoint() { //tworzenie zbioru punktow Set<Waypoint> waypoints = new HashSet<Waypoint>();
waypoints.add(new
waypoint(41.881944,-87.627778));
waypoints.add(new Waypoint(40.716667,-74));
//WaypointPainter odrysowuje punkty WaypointPainter painter =
new WaypointPainter();
painter.setWaypoints(waypoints);
jXMapKit1.getMainMap().
setOverlayPainter(painter);
}
Przeładowanie standardowego sposobu rysowania punktów
Painter.setWaypoints(waypoints);
painter.setRenderer(new WaypointRenderer() { public boolean paintWaypoint(Graphics2D g, JXMapViewer map, Waypoint wp) {
g.setColor(Color.RED);
g.drawLine(-5,-5,+5,+5);
g.drawLine(-5,+5,+5,-5);
return true;
} });
jXMapKit1.getMainMap().setOverlayPainter(painter);
Źródło: http://today.java.net/pub/a/today/2007/10/30/building-maps-into-swing-app-with-jxmapviewer.html
Przykład
Android – projekt Google Mobile Phone
http://code.google.com/android/adc.html