260 likes | 543 Views
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
E N D
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
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” Przykład modyfikacji synth Przykład: Rozkład Regionów dla JScroll SynthLookAndFeel laf = new SynthLookAndFeel(); laf.load(MyClass.class.getResourceAsStream("laf.xml"), MyClass.class); UIManager.setLookAndFeel(laf); Źródło: http://java.sun.com/docs/books/tutorial/uiswing/lookandfeel/synth.html
Modyfikacja Synth w XML i w programie W kodzie programu W pliku XML 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> 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()
Akcje które mogą być realizowane przez Java Dekstop API: BROWSE MAIL OPEN EDIT PRINT Różne aplikacje mogą być zarejestrowane dla powyższych akcji Java Desktop API Źródło: http://java.sun.com/docs/books/tutorial/uiswing/misc/desktop.html 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) { //use.printStackTrace(); } }
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)
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 System Tray (2) 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); Więcej! http://java.sun.com/docs/books/tutorial/uiswing/misc/systemtray.html
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ą
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() Obsługa Splash Screen 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…)
Modyfikacja lokalizacji – przesuwanie mapy: setAddressLocation() Przykład ustawienia lokalizacja na Łódź: jXMapKit1.setAddressLocation(new 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() Użycie JXMapKit 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
Android – projekt Google Mobile Phone http://code.google.com/android/adc.html
Co dalej … • Aplikacje wielowątkowe • Animacje • Prezentacja Java w Telekomunikacji • Aplikacje sieciowe • Wykorzystanie XML i baz danych