Plan wykładu i18n o kontekście w aplikacji z GUI narzędzia ułatwiające życie: JOptionPane Swing i wielowątkowość użycie klasy SwingUtilities użycie klasy.

Slides:



Advertisements
Podobne prezentacje
Programowanie obiektowe
Advertisements

Programowanie obiektowe
1 Dzisiejszy wykład Klasa string wersja prosta wersja ze zliczaniem odwołań Wyjątki Specyfikator volatile.
Rafał Hryniów Tomasz Pieciukiewicz
Nguyen Hung Son Uniwersytet Warszawski
Aplikacje w sieciach Internet/Intranet
Dokumentowanie wymagań w języku XML
WekaSQL Język i aplikacja przetwarzania oraz eksploracji danych.
WekaSQL Język i aplikacja przetwarzania oraz eksploracji danych.
Wykład 2: Systemy klasy C.A.T. (Computer-Aided Translation)
Zaawansowane technologie Javy
Java – technologie zaawansowane Wykład 8 (9 maja 2011)
PODSTAWY JĘZYKA PHP 1. czym jest 2. składnia 3. wersje 4. bazy danych
Wykład 1: Wskaźniki Podstawy programowania Programowanie w C
SO – LAB3 Wojciech Pieprzyca
Praca Dyplomowa Inżynierska
Systemy zarządzania treścią CMS
Język Java Wielowątkowość.
Podstawy Informatyki zajęcia dla Studentów I-go roku studiów na Wydziale Fizyki i Informatyki Stosowanej AGH Dr inż. Piotr Gronek Zakład Informatyki Stosowanej.
Piotr Kasprzyk Instytut Informatyki Politechniki Śląskiej
Made by Mateusz Szirch Kilka słów o JavaScript.
Pierwszy zestaw problemów do samodzielnego rozwiązania na zaliczenie wykładu: chemii/Metody_statystyczne_2009_poblem1.doc.
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Programowanie obiektowe III rok EiT
Integracja aplikacji Wykład 2
KONSTRUKCJA KOMPILATORÓW WYKŁAD WYKŁAD Robert Plebaniak Robert Plebaniak.
Generator analizatorów leksykalnych
Prezentacja I Objaśnienie
Podstawy Programowania
TIK w szkole podstawowej MAPY MYŚLOWE i MAPY POJĘĆ
Arkadiusz Twardoń ZTiPSK
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VIII.
Programowanie obiektowe – zastosowanie języka Java SE
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład IX.
Programowanie obiektowe III rok EiT
Temat 3: Podstawowa struktura dokumentu
ZAKŁAD SYSTEMÓW KOMPUTEROWYCH
Współpraca z innymi aplikacjami. Organizacja informacji 10 XII 2013.
Lekcja 2 Składnia języka XHTML
Kurs języka C++ – wykład 8 ( )
Zaawansowane komponenty graficzne Swing
Projektowanie stron WWW
Specjalizacja "Dziennikarstwo On-line„ HTML – XHTML część 1 Prowadzący: Dariusz Jaruga
Podstawy języka Instrukcje - wprowadzenie
K URS JĘZYKA C++ – WYKŁAD 7 ( ) Wyjątki.
XML Publisher Przedmiot i zakres szkolenia Przedmiot i zakres szkolenia Przeznaczenie XML Publisher Przeznaczenie XML Publisher Definiowanie Definiowanie.
Seminarium Dyplomowe Jacek Fohs.
Informatyka Stosowana – ROK II / III
Temat 1: Ogólne cechy języka PHP
HTML (ang. HyperText Markup Language ) – język do tworzenia stron internetowych opierający się na znacznikach, czy inaczej je nazywając – tagach. Język.
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
Projektowanie Aplikacji Internetowych Artur Niewiarowski Wydział Fizyki, Matematyki i Informatyki Politechnika Krakowska.
Java profiler based on byte code analysis and instrumentation for apdaptation the source code in many-core hardware accelerators Marcin Pietroń, Dominik.
Podstawy języka skryptów
Temat 5: Instrukcje: print(), echo()
Temat 2: Składnia kaskadowych arkuszy stylów. Za zmianę wyglądu witryny w kaskadowych arkuszach stylów odpowiadają reguły stylów. Każda z reguł powiązana.
Technologie internetowe
Programowanie w językach skryptowych
Władcy Móch Wzorzec flyweight. Problem Mamy dużo bardzo podobnych obiektów Obiekty mają w dużej części podobny stan Obiekty stanu mogą być ciężkie.
PHP. PHP obiektowy, skryptowy język programowania zaprojektowany do generowania stron internetowych w czasie rzeczywistym.
Podstawy programowania
Formatowanie tekstu Sabina Charasim. Informacje podstawowe HTML posiada bardzo wiele znaczników służących do formatowania tekstu. Jedne używa się bardzo.
Sławomir Staśkiewicz JBossAS i EJB 3.1 Sławomir Staśkiewicz
Języki i technologie wytwarzania stron WWW Autor: Michał Walkowski Referat.
ST | 9/16/2015 | © Robert Bosch GmbH All rights reserved, also regarding any disposal, exploitation, reproduction, editing, distribution, as well.
Programowanie obiektowe – zastosowanie języka Java SE
Aplikacje i usługi internetowe
Tworzenie wątków w Javie
Zapis prezentacji:

Plan wykładu i18n o kontekście w aplikacji z GUI narzędzia ułatwiające życie: JOptionPane Swing i wielowątkowość użycie klasy SwingUtilities użycie klasy SwingWorker inne sposoby ( FoxTrot )

Internationalization (i18n) Co to jest i18n? dopasowanie aplikacji do konkretnego regionu i języka sposób wyświetlania dat, numerów kierunek i czcionka użyta do wyświetlania tekstu język napisów w aplikacji sposób ułożenia komponentów w GUI operacje na tekście (porównania, detekcja słów) Po co i18n? łatwość wprowadzania zmian, nawet gdy aplikacja jest przeznaczona na jeden rynek łatwość zarządzania zasobami

i18n – jak wykryć język? java.util.Locale.getDefault() Locale.getAvailableLocales() new Locale(lang, ctry, varnt) obiekt Locale = język + kraj + wariant

Przykład – skrypt w BeanShellu Locale [] locales = Locale.getAvailableLocales(); for (int i=0;i<locales.length;i++) { System.out.println( "Name: " + locales[i].getDisplayName() + ", language: " + locales[i].getDisplayLanguage() + ", country: " + locales[i].getDisplayCountry() + ", variant: " + locales[i].getDisplayVariant() ); } Name: niemiecki, language: niemiecki, country:, variant:, iso: deu_ Name: niemiecki (Austria), language: niemiecki, country: Austria, variant:, iso: deu_AUT Name: niemiecki (Austria,Euro), language: niemiecki, country: Austria, variant: Euro, iso: deu_AUT Name: niemiecki (Szwajcaria), language: niemiecki, country: Szwajcaria, variant:, iso: deu_CHE Name: niemiecki (Niemcy), language: niemiecki, country: Niemcy, variant:, iso: deu_DEU Name: niemiecki (Niemcy,Euro), language: niemiecki, country: Niemcy, variant: Euro, iso: deu_DEU Name: niemiecki (Luksemburg), language: niemiecki, country: Luksemburg, variant:, iso: deu_LUX Name: niemiecki (Luksemburg,Euro), language: niemiecki, country: Luksemburg, variant: Euro, iso: deu_LUX

i18n – formatowanie napisów java.text. MessageFormat(format, locale) Czym jest pole format? tekst i pola specjalne: liczby, daty, czas, waluta… Sposób wykorzystania: wywołanie metody format(Object [] args) Time: {0,time}, Date: {0,date}, Number: {1,number}, Number (formatted): {1, number, #.0}, Currency: {2, number, currency}.

i18n – formatowanie napisów import java.text.MessageFormat; Locale [] locales = Locale.getAvailableLocales(); Object [] arguments = new Object [] { new Date( System.currentTimeMillis() ), new Double( ), new Integer(10023), }; out = new PrintWriter(new OutputStreamWriter(System.out, "UTF-8")); for (int i=0;i<locales.length;i++) { MessageFormat mformat = new MessageFormat("Time: {0,time}, Date: {0,date}, Number: {1,number}, " + "Number (formatted): {1, number, #.0}, + "Currency: {2, number, currency}.", locales[i]); String result = mformat.format(arguments); out.println("locale: " + locales[i].getISO3Language() + "_" + locales[i].getISO3Country() + " result: " + result ); }

i18n – formatowanie liczb locale: ara_BHR result: Time: 09:37:20 ص, Date: 29/10/2003, Number: 12, , Number (formatted): , Currency: د. ب. 10,023. locale: ara_DZA result: Time: 09:37:20 ص, Date: 29/10/2003, Number: 12, , Number (formatted): , Currency: د. ج. 10,023. locale: eng_CAN result: Time: 9:37:20 AM, Date: 29-Oct-2003, Number: 12, , Number (formatted): , Currency: $10, locale: eng_GBR result: Time: 09:37:20, Date: 29-Oct-2003, Number: 12, , Number (formatted): , Currency: £10, locale: jpn_JPN result: Time: 9:37:20, Date: 2003/10/29, Number: 12, , Number (formatted): , Currency: 10,023. locale: pol_ result: Time: 09:37:20, Date: , Number: ,142, Number (formatted): 12003,1, Currency: ¤ ,00. locale: pol_POL result: Time: 09:37:20, Date: , Number: ,142, Number (formatted): 12003,1, Currency: zł.

Zasoby tekstowe i i18n Klasa ResourceBundle Metoda getString(String key) np. getString("ok.string") Metoda getBundle(String baseName, Locale locale, ClassLoader loader) Jak tworzona jest instancja ResourceBundle? candidate bundle names baseName_language_country_variant baseName_language_country baseName_language baseName_defaultLanguage_defaultCountry_defaultVariant … Poszukiwana klasa o nazwie takiej, jak kandydat Jeśli nie znaleziono, używany jest PropertyResourceBundle

Przykład – resource bundles Default: Słój pełen pysznych ciastek. UK: A jar full of yummy biscuits Chinese: A jar full of yummy cookies // default resource bundle... ResourceBundle bundle1 = ResourceBundle.getBundle("napisy", Locale.getDefault()); // get specific resource bundle (British English) ResourceBundle bundle2 = ResourceBundle.getBundle("napisy", Locale.UK); // get specific resource bundle (chinese) - example // of fallback action if resource does not exist. ResourceBundle bundle3 = ResourceBundle.getBundle("napisy", Locale.ENGLISH); key = "sloj.pelen.pysznych.ciach"; System.out.println("Default: " + bundle1.getString(key)); System.out.println("UK: " + bundle2.getString(key)); System.out.println("Chinese: " + bundle3.getString(key));

Przykład – resource bundles (2) napisy.properties: # default American English locale sloj.pelen.pysznych.ciach=A jar full of yummy cookies napisy_en_GB.properties: # British English locale sloj.pelen.pysznych.ciach=A jar full of yummy biscuits napisy_pl.properties: # Polish locale sloj.pelen.pysznych.ciach=S\u0142\u00f3j pe\u0142en pysznych ciastek. W plikach property mogą występować jedynie litery alfabetu US-ASCII (podstawowy). Inne znaki koduje się za pomocą narzędzia native2ascii

Plan wykładu i18n o kontekście w aplikacji z GUI narzędzia ułatwiające życie: JOptionPane Swing i wielowątkowość użycie klasy SwingUtilities użycie klasy SwingWorker inne sposoby ( FoxTrot )

O kontekście w aplikacji z GUI aplikacje GUI mają z natury obiektową strukturę – komponenty dają się łatwo izolować zadanie utrudniają niektóre aspekty, np. dostęp do zasobów, napisów (i18n) dostęp do obiektów zarządzających (controller) aspekty nie są zazwyczaj związane ze strukturą obiektową GUI, a jedynie wskazują na obiekty potrzebne w danym miejscu programu

O kontekście w aplikacji z GUI Przekazanie obiektów potrzebnych do implementacji pewnego aspektu często przez metody/ pola statyczne/ obiekty typu singleton przez wiele parametrów (konstruktory) obiekt kontekstu AspectJ – rozszerzenie Javy o aspekty

Co zawiera kontekst? Wszystkie obiekty, które są potrzebne z punktu widzenia aspektów i18n uchwyty do kontrolerów źródeł zewnętrznych (np. połączenie z bazą danych) kontekst może (powinien) być również generatorem zdarzeń zmiana języka interfejsu zerwane połączenie z bazą danych

Jak przekazywać kontekst? Najwygodniej chyba jako właściwość property obiektów: setContext(ApplicationContext context)

Plan wykładu i18n o kontekście w aplikacji z GUI narzędzia ułatwiające życie: JOptionPane Swing i wielowątkowość użycie klasy SwingUtilities użycie klasy SwingWorker inne sposoby ( FoxTrot )

Czym jest javax.swing.OptionPane ? JOptionPane makes it easy to pop up a standard dialog box that prompts users for a value or informs them of something. Wsparcie dla: prostych okienek informacyjnych wybór opcji wprowadzanie tekstu bardziej skomplikowane dialogi Wszystkie dialogi są modalne!

Przykłady… JOptionPane.showMessageDialog(null, "Eggs aren't supposed to be green."); JOptionPane.showMessageDialog(null, "Eggs aren't supposed to be green.", "Insane warning", JOptionPane.WARNING_MESSAGE); JOptionPane.showMessageDialog(null, "Eggs aren't supposed to be green.", "Insane warning", JOptionPane.ERROR_MESSAGE);

Przykłady Object[] options = {"Yes, please", "No, thanks", "No eggs, no ham!"}; int n = JOptionPane.showOptionDialog(null, "Would you like some green eggs to go with that ham?", "A Silly Question", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[2]);

Przykłady Object[] possibilities = {"ham", "spam", "yam"}; String s = (String) JOptionPane.showInputDialog( null, "Complete the sentence:\n" + "\"Green eggs and...\"", "Customized Dialog", JOptionPane.PLAIN_MESSAGE, null /* custom icon */, possibilities, "ham");

Zaawansowane użycie JOptionPane Parametr message może być dowolnym komponentem lub tablicą komponentów JPanel message = new JPanel( new BorderLayout()); JScrollPane scrollPane = new JScrollPane(); scrollPane.getViewport().add(new JTree()); scrollPane.setPreferredSize(new Dimension(200,300)); message.add( scrollPane, BorderLayout.CENTER ); message.add( new JCheckBox("Zawsza ta opcja"), BorderLayout.SOUTH ); int n = JOptionPane.showConfirmDialog(null, message, "Customized dialog", JOptionPane.OK_CANCEL_OPTION);

Plan wykładu i18n o kontekście w aplikacji z GUI narzędzia ułatwiające życie: JOptionPane Swing i wielowątkowość użycie klasy SwingUtilities użycie klasy SwingWorker inne sposoby ( FoxTrot )

Model wielowątkowości w SWING Swing jest jednowątkowy wątek obsługujący komunikaty jest ukryty Swing nie jest aplikacją thread-safe nie można (nie powinno się) wykonywać operacji na komponentach z równolegle działających wątków częściowo z: Simone Bordet, A New Solution for Using Threads with the Java […]

O niepoprawnych programach… Jedyny wątek, który ma prawo wpływać na GUI to EventDispatchingThread SwingUtilities.isEventDispatchThread() frame.setSize(200,200); frame.pack(); frame.show(); // CONCURRENT ACCESS TO SWING! frame.setTitle("Bubu");

O niepoprawnych programach (2) obiekty listener są wywoływane przez Swing, a więc są bezpieczne wykonanie akcji powinno być jak najszybsze, bowiem blokuje odświeżanie GUI JFrame frame = new JFrame("Swing Freeze Test"); final JButton button = new JButton("Freeze me !"); frame.getContentPane().add(button); button.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { button.setText("Sleeping..."); Thread.currentThread().sleep(10000); button.setText("Freeze me !"); } }); frame.setSize(200,200); frame.pack(); frame.show(); Sleeping?

Jak poradzić sobie z problemem? Metoda najprostsza: SwingUtilities.invokeLater(Runnable) kolejkuje zadanie dla wątku Swinga natychmiast powraca (nie blokuje) można stosować z każdego punktu w programie Problemy: brak synchronizacji z wątkiem roboczym mocno zakręcony kod aplikacji trudności z kodem zwracającym wartość lub przechwyceniem wyjątków

Rozwiązanie przy pomocy invokeLater JFrame frame = new JFrame("Swing Freeze Test"); final JButton button = new JButton("Freeze me !"); frame.getContentPane().add(button); button.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { button.setText("Sleeping..."); button.setEnabled(false); new Thread() { public void run() { Thread.currentThread().sleep(3000); SwingUtilities.invokeLater( new Runnable() { public void run() { button.setEnabled(true); button.setText("Freeze me !"); } }); } }.start(); } }); frame.setSize(200,200); frame.pack(); frame.show(); swing-safe

Użycie SwingWorker SwingWorker powstał jako łata na problemy z długimi operacjami w listenerach nie jest częścią Swinga – trzeba pobrać samodzielnie

JFrame frame = new JFrame("Swing Freeze Test"); final JButton button = new JButton("Freeze me !"); frame.getContentPane().add(button); button.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { button.setText("Sleeping..."); button.setEnabled(false); SwingWorker worker = new SwingWorker() { public Object construct() { try { Thread.currentThread().sleep(3000); } catch (InterruptedException e) {} return "some-value"; } public void finished() { // called on the event dispatching thread! button.setEnabled(true); button.setText("Freeze me!, returned: + get()); } }; worker.start(); // start the lengthy task } ); frame.setSize(400,50); frame.show();

Inne sposoby… Foxtrot ( ) synchroniczna obsługa długich zadań wyjątki w miejscu wywołania

final JButton button = new JButton("Take a nap !"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { button.setText("Sleeping..."); String text = null; try { text = (String)Worker.post(new Task() { public Object run() throws Exception { Thread.sleep(10000); return "Slept !"; } }); } catch (Exception x)... button.setText(text); somethingElse(); } });