Inlupp1 - kommentarer Var gärna mer specifika när ni skriver i dagboken, jämför: arbetade på inlupp1 la in en avsluta-knapp i gränssnittet Servern ska självfallet startas när klienten startas och på samma sätt avslutas först när klienten avslutas. Sleep behövs inte i klienten utan fanns i testkoden mest för att tydligare illustrera förloppet. Ni följer javas kodkonventioner bra, men kanske ska man minska indraget till 2? /* -*- c-basic-offset: 2; -*- */ Generellt sett bra javadoc och kommentarer, men koda och kommentera på engelska Informationsteknologi #1 Uppgift 2 Deadline måndag 9/2 klockan 12.00, om två veckor Syfte Lära sig hur man internationaliserar program, hur centraliserad färgläggning fungerar, samt - viktigast - vad en listener är. Inre och anonyma klasser ska vara bekanta. Program ska kunna komma ihåg vad användaren gjorde senast. Informationsteknologi #2 Uppgift 2 1. Themes för all färg- och texthantering. 2. Inre klasser där så behövs. 3. Ikoner. 4. Meny med åtminstone Exit och About. 5. Actions, för alla knappar och menyer. 6. Internationalisering, I18N. Stödja minst 2 språk, via Property-filer. Alla strängar (som används i gränssnittet) ska vara internationaliserade. 7. Klienten ska komma upp med samma storlek och på samma plats som den hade vid förra avslut. (Spara/Läs från fil) 8. Resize. Klienten ska vara vettig trots att man ändrar storlek på fönstret 9. Ta emot och visa chat-meddelanden. Kaffe-meddelanden ska på något sätt hanteras annorlunda än de andra typerna av meddelande. 10. Presentera vilka användare som är online just nu. 11. Skriv en ant-regel inlupp2-dist för att göra en körbar jar som startar blazon.ui.inlupp2. 12. Skriv två ant-regler inlupp2-sv och inlupp2-en för att starta klienten på svenska respektive engelska. Informationsteknologi #3 1
Gruppträffarna Uppgift till torsdagen den 29/1 Presentera minst tre olika layout managers, hur de fungerar grafiskt och hur de hanterar storleksförändringar. Inga kodexempel behövs. Uppgift till torsdagen den 5/2 Förklara hur listeners och events hänger ihop - dvs vad är det som händer under ytan när en knapp trycks ned? Inga djupdykningar i kodexempel behövs, utan det viktigaste är att principerna framgår. Informationsteknologi #4 I18N språkoberoende java -Duser.region=SE -Duser.language=sv blazon.ui.inlupp1 java -Duser.region=US -Duser.language=en blazon.ui.inlupp1 Fil: blazon/ui/lang.properties: ui.ok = Ok ui.cancel = Cancel Fil: blazon/ui/lang_sv.properties: ui.ok = Okej ui.cancel = Avbryt ResourceBundle rb = ResourceBundle.getBundle( blazon.ui.lang ); String okstring = rb.getstring( ui.ok ); JButton okbutton = new JButton(okString); Informationsteknologi #5 ResourceBundle Läs javadoc för RB.getBundle() + alla getbundlemetoderna Bra om man enkelt kan se i resurs-filen var texten används: ui.menu.exit.name ui.menu.exit.mne = Exit = x Misslyckad försök: exit=exit Informationsteknologi #6 2
Färg/Theme Java Look & Feel Guidelines: http://java.sun.com/products/jlf/ed2/book/index.html Provkör och se kod: /it/sw/java/jdk/1.4.2/demo/jfc/metalworks Informationsteknologi #7 Kapitel 9: Look & Feel Guidelines Kapitel 6: Informationsteknologi #8 Ikoner På följande url finns en artikel om de ikoner Sun delar ut: http://java.sun.com/developer/techdocs/hi/repository/ Ikonerna finns även lokalt under: http://www.it.uu.se/edu/course/homepage/devgui/vt04/material/icons Informationsteknologi #9 3
Informationsteknologi #10 Ikoner i koden URL u = Client.class.getResource("exit.gif"); JButton exitbutton = new JButton(new ImageIcon(u)); Förutsätter att exit.gif ligger bredvid Client.class Alltså så måste man kopiera över sådan data efter kompilering (görs av Ant) All data, även bilder, måste ligga i src, eftersom det är den katalogen man sparar i CVS Informationsteknologi #11 Kapitel 8 i Eckel Viktigaste kapitlet! Inner classes Informationsteknologi #12 4
Inner class public class Foo { int i; public class Bar { int k = i; void test() { A a = new A(); B b = new B(); Informationsteknologi #13 Inner classes, upcasting interface Sedlar { int getnoof100(); public class Bankomat { public Sedlar getsedelstatus() { return new S(); // we only have 500! private class S implements Sedlar { public int getnoof100() { return 0; public int get500() { return 42; Informationsteknologi #14 Inner classes, anonymous interface Sedlar { int getnoof100(); public class Bankomat { public Sedlar getsedelstatus() { return new Sedlar() { public int getnoof100(){return 0; ; ; Informationsteknologi #15 5
Är det någon skillnad? interface Sedlar { int get100(); Sedlar s1 = new Sedlar() { public int get100() { return 0; ; class Foo implements Sedlar { public int get100() { return 0; Sedlar s2 = new Foo(); Informationsteknologi #16 Scope for inner class If you re defining an anonymous inner class and want to use an object that s defined outside the anonymous inner class, the compiler requires that the argument reference be final, like the argument to dest( ). If you forget, you ll get a compile-time error message. En inre klass ser yttre omgivande klass (dess globala var.) variabler deklarerade som final Informationsteknologi #17 Scope class Bank { int i; void bills() { int k = 0; final int f = 7; Sedlar s1 = new Sedlar() { // ser i & f, ej k public int get100() { return 0; ; // Bank Informationsteknologi #18 6
ActionListener (AL) // KASS, ej OOP class Foo implements ActionListener { JButton b = new JButton(); b.addactionlistener(this); // ugly! wrong! // doit Informationsteknologi #19 AL 2 // Nja, ibland ok oftast inte class Foo { class Bar implements ActionListener { // doit JButton b = new JButton(); b.addactionlistener(new Bar()); Informationsteknologi #20 AL 2.1 class Foo { class Bar implements ActionListener { // doit Bar bar = new Bar(); JButton b1 = new JButton(); JButton b2 = new JButton(); b1.addactionlistener(bar); b2.addactionlistener(bar); // smart, delar action Informationsteknologi #21 7
AL 3 // Bra! class Foo { JButton b = new JButton(); b.addactionlistener(new ActionListener() { // doit ); Informationsteknologi #22 AL 4 scope? class Foo { private int i; int k = 0; final m = 0; JButton b = new JButton(); b.addactionlistener(new ActionListener() { // ser i och m, ej k ); Informationsteknologi #23 Action Actions är ett sätt att på ett och samma ställe definiera egenskaper som behövs i samband med t.ex. knappar. Se javadoc för javax.swing.action. Innehåller Accelerator, Mnemonic, Name, Icon, Description (kort+lång), Enabled?, command Exempel new JButton(new ExitAction()); new JButton(new ExitAction(rb)); How to Use Actions http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html Informationsteknologi #24 8
Action exempel Action left = new AbstractAction("Go left", new ImageIcon( a.gif")) { public void actionperformed(ae e) { move( left ); ; JButton b = new JButton(left); JMenuItem menuitem = moveaboutmenu.add(left); left.setenabled(false); Informationsteknologi #25 Action Det är ej nog att göra som i förra exemplet; vi behöver fler funktioner än namn & ikon från en Action mnemonic, description, Bättre skapa en inre klass, med riktig konstruktor Kom ihåg Allt ska vara språkoberoende! Informationsteknologi #26 Meny http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html Använd Actions! Informationsteknologi #27 9