Uppgift 4. Uppgift 4. Uppgift 4. Uppgift 4. Uppgift 4. Uppgift 4. Syfte. Konstruktion av användargränssnitt. Deadline 14/3 kl 10.

Relevanta dokument
Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

Objektorienterad Programkonstruktion. Föreläsning dec 2015

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Föreläsnings 9 - Exceptions, I/O

Concurrency Saker händer samtidigt. Process En instans av ett program

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Exam Concurrent and Real-Time Programming

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Laboration 24 Databasen MySQL och java

9 Aktiva objekt och trådar

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Labb 1: Vad, hur, och varför?

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Föreläsning 11 Aktiva objekt och trådar, strömmar, kommunikation DAT043,

Att skriva till och läsa från terminalfönstret

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Gränssnitt för FakeGranska. Lars Mattsson

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Föreläsning 3: Händelsestyrda program och användargränssnitt

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

F4. programmeringsteknik och Matlab

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

DAT043 - föreläsning 8

Kopiering av objekt i Java

Inlupp1 - kommentarer. Uppgift 2. Uppgift 2

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Classes och Interfaces, Objects och References, Initialization

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Lösningar för tenta 3 DAT043,

CliMate följer Tre-lager-arkitektur. Domänobjekt - domänlogiklagret. Viktiga domänklasser i CliMate. De tre lagren. Paketen i CliMate:

Laboration A Objektsamlingar

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

OOP Objekt-orienterad programmering

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

Parallellism, återblick

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Trådar. Aktiva objekt

Objektorienterad programmering Föreläsning 2

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Objektsamlingar i Java

Laboration 3 GUI-programmering

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Objekt, Klasser, Paket m. m.

OOP Objekt-orienterad programmering

Tentamen FYTA11 Javaprogrammering

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Föreläsning 2 Datastrukturer (DAT037)

Lösningsförslag tentamen FYTA11 Java

Design och konstruktion av grafiska gränssnitt

Lösningsförslag till tentamen FYTA11 Javaprogrammering

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Länkade strukturer, parametriserade typer och undantag

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

1 Comparator & Comparable

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

JAVAUTVECKLING LEKTION 4

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 1 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Klassdeklaration. Metoddeklaration. Parameteröverföring

Objektorienterad Programmering (TDDC77)

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

Föreläsning 3. Stack

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Föreläsning 8: Exempel och problemlösning

Recitation 4. 2-D arrays. Exceptions

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Stackar, köer, iteratorer och paket

Upplägg. Introduktion. Examination. Mål. Konsekvenser. Java. Kursen heter konstruktion, ej design eller formgivning.

Ingenjörsfirman Stéen Java Sida 1 av 1

Swing. MER Java Foundation Classes (JFC) Hur lära sig? Vad är farorna. LayoutManagers. Exempel på några av komponenterna

Tentamen Programmering fortsättningskurs DIT950

Transkript:

Uppgift Konstruktion av användargränssnitt Uppgift Syfte Under fjärde uppgiften kommer ni att få känna på lite mer om trådning, avbrottsstyrning. Efter denna uppgift ska ni veta varför/hur Swing är enkeltrådat, samt hur man gör avbrottsstyrda funktioner. Dvs t.ex. hur man skapar gränssnitt som inte hänger sig vid tunga operationer. Deadline / kl. IT Informationsteknologi # Uppgift Utritning av grafik i Swing är "enkeltrådat", vilket har vissa konsekvenser. Absolut viktigast i denna uppgift är att swingtråden inte "hänger sig" när jobbiga operationer utförs. Man måste också se till att Swinganrop alltid görs från Swings event-tråd. Uppgift Ni ska bygga ut er applikation med möjligheten att välja att lägga till hela kataloger och alla dess underkataloger till playlisten. Katalogerna ska sökas igenom och samtliga MP-filer som hittas ska efterhand läggas till i playlisten. Denna operation kan ta lång tid och för att hela gränssnittet då inte ska "hänga" sig är det viktigt att man sköter trådningen på rätt sätt. Informationsteknologi # Informationsteknologi # Uppgift Det ska finnas nån form av progressbar för genomsökningen som ger en uppfattning av vad som sker och hur mycket det är kvar att göra. Genomsökningen ska kunna ska även kunna pausas, återupptas och avbrytas. Det ska fortfarande gå att använda spelaren som vanligt under tiden som en genomsökning pågår. Uppgift Man ska kunna ladda och spara en playlist. Det räcker med att den playlist man senast hade laddas när man öppnar programmet, men det är fritt fram att göra mer sofistikerad playlisthantering. Man ska kunna markera flera låtar i en spellista och på något sätt kunna välja att ta bort samtliga markerade (tex popup-meny och/eller snabbtangent) Man ska kunna klicka på en låt och på något sätt välja att hoppa dit i spellistan. Informationsteknologi # Informationsteknologi #

Uppgift Spelaren ska vara språkoberoende, enligt samma princip som Uppgift och. Spelaren ska även fortsättningsvis använda themes för all färg- och fonthantering, enligt samma princip som Uppgift och. Ni ska även fortsättningsvis använda er av Actions där det är vettigt. Skapa en ant-regel player som startar klassen player.ui.player (som är den klass som ska köras). (Uppgift ) Extra för de som vill: lägg till möjligheten att välja slumpmässig uppspelning av spellistan och möjligheten att repetera den i all oändlighet. Extra för de som vill: gör det möjligt att släppa filer från filsystemet på spellistan (drag-anddrop). Informationsteknologi #7 Informationsteknologi # (Uppgift ) Om man vill: Eftersom det är sista uppgiften så är det självklart positivt för helhetsintrycket att visa vad man lärt sig under kursens gång. Det är med andra ord helt okej att göra en förbättrad tabellmodell, snyggare actions, bättre hantering av resize etc etc, om man tycker sig ha kommit på bättre lösningar under kursens gång. En stor del av programvarutvecklingen handlar om att lära sig av sina tidigare erfarenheter. Trådar Definition: A thread is a single sequential flow of control within a program. Informationsteknologi #9 Informationsteknologi # Swing är enkeltrådat Once a Swing component has been realized, all code that might affect or depend on the state of that component should be executed in the event-dispatching thread. Undantag: repaint(), revalidate(), invalidate() Samt metoder som enligt javadoc är thread safe Kör vi på event-tråden nu? Om osäker, enkel koll genom: if (EventQueue.isDispatchThread()) { Insikt: public void actionperformed(actionevent e) // klart att vi är event-tråd här! Informationsteknologi # Informationsteknologi #

Varför enkeltrådat? Komplicerat göra ett toolkit tråd-säkert Få utvecklare kan hantera UI med flera trådar Händelser kommer i garanterad ordning (slipper icke-determinism) Snabbare UI (slipper synkronisering) Lösningar: SwingUtilities.invokeLater SwingUtilities.invokeAndWait SwingWorker Thread Timer SwingUtilities.invokeLater Mekanism som används för att lägga en referens till ett kodblock på event-kön. När event-tråden kommer till kodblocket så körs den. GUI t kan på det viset uppdateras av kodblocket eftersom det körs på event-tråden. invokelater() metoden returnerar direkt utan att invänta att event-dispatch tråden exekverar koden. Runnable dowork = new Runnable() { public void run() { drawsome(); ; SwingUtilities.invokeLater(doWork); Informationsteknologi # Informationsteknologi # SwingUtilities.invokeAndWait invokeandwait() metoden fungerar som invokelater(), utom att invokeandwait() inte returnerar innan event-dispatching tråden har exekverat kodblocket. void showhellotheredialog() throws Exception { Runnable showmodaldialog = new Runnable() { public void run() { JOptionPane.showMessageDialog(frame, "Hi"); ; SwingUtilities.invokeAndWait(showModalDialog); SwingWorker SwingWorker ingår inte i Java-distributionen utan är en egen klass/fil Finns på uppgift -sidan att ladda hem om man vill final SwingWorker worker = new SwingWorker() { public Object construct() { // do long operation here // NOTE: runs on a background thread public void finished() { // called when construct is done // NOTE: runs on the event dispatching thread ; worker.start(); Informationsteknologi # Informationsteknologi # SwingWorker construct() metoden används till att utföra något som kan vara tidsödande. Exempelvis: Blockera i väntan på disk I/O eller nätverk Utföra omfattande beräkningar Exekvera kod som kan resultera i att många klasser laddas. Vänta på nån annan resurs Timer Om ens program måste utföra en viss sak om och om igen med nåt intervall kan det vara bra att överväga java.util.timer eller javax.swing.timer klassen. Timer klassen är också bra om man vill ha något gjort efter en viss delay. Dvs Task-Scheduling. Informationsteknologi #7 Informationsteknologi #

x Timer java.util.timer javax.swing.timer The important difference between using the Swing Timer class and creating your own Thread is that the Swing Timer class uses just one thread for all timers. The other important feature of this timer class is that the actionperformed method runs on the event-dispatching thread. As a result, you don't have to bother with an explicit invokelater call. Trådar och CPU Ej bra att slösa bort processorkraft i onödan Trådar bör ge tillbaka tid till OS:et // fel, tar massor med resurser while (b) { checkfordata(); // bättre while (b) { checkfordata(); Thread.sleep(); try/catch runt sleep behövs Informationsteknologi #9 Informationsteknologi # Uppgift till torsdagen den / Var beredd att kunna beskriva hur invokelater() resp invokeandwait() fungerar och förhåller sig till varandra. Var beredd att kunna förklara hur Java:s keyword synchronized fungerar och hur man kan dra nytta av det. Titta på klasserna java.util.timer och java.util.timertask och fundera över vilken nytta man kan dra av dessa i gränssnittssammanhang. Uppgift till torsdagen den / Kommentera gränssnittet (uppgift ) från annan grupp. Projektor och jar-filer kommer att finnas under gruppträffen. Vid det här laget har ni kanske börjat laborera med att göra saker i separata trådar; vad får det för konsekvenser att Swing är enkeltrådat? Informationsteknologi # Informationsteknologi # Antal svar:, frånvarande:. Vad tycker du om föreläsningarna? [=mycket dåliga, =mycket bra] (.) Series. Vad tycker du om gruppträffarna? [=mycket dåliga, =mycket bra] (.7) Series Informationsteknologi # Informationsteknologi #

. Vad tycker du om kursmaterialet (TiJ + länkar + webben) [=mycket dåligt, =mycket bra] (.). Hur bedömer du din arbetsinsats? [=mycket liten, =mycket stor] (.) 7 Series Series Informationsteknologi # Informationsteknologi #. Har du tillräckliga förkunskaper? [=inte alls, =mer än nog] (.). Vad tycker du om kursens svårighetsgrad? [=mycket lätt, =mycket svår] (.) Series Series Informationsteknologi #7 Informationsteknologi # Ni tycker att det är kul att arbeta praktiskt i grupper En del tycker att uppgifterna är svåra att dela upp på fyra personer Inget krav att man delar upp arbetet! Agile utvecklingsmetoder som tex. XP förespråkar att man ska arbeta i par (parprogrammering), detta kan vara effektivare än att jobba som fyra individer. Dagboken strular SunRay:arna har någon form av bugg som dyker upp med just dagboken. Buggar kring inmatning av dagboksposter, några av dessa är nu fixade. Ny dagboks-jar kommer finnas tillgänglig. Föreläsningar En del vill ha längre föreläsningar/mer innehåll. Kursen bygger dock mer på att man ska lära sig genom att göra än att höra. Detta passar inte alla, men på denna kurs frångår vi den vedertagna standarden med föreläsningar/labbar/tenta, därför att vi tror att man bättre lär sig den arbetsmetodik som man måste ha vid gränssnittsutveckling genom praktiskt arbete och egen informationshämtning. Se inte timmarna då ni försöker få något att fungera som bortslösad tid. Det är så man lär sig! Var dock inte allt för envisa, ibland kan det vara betydligt mer produktivt att fråga - det är lätt att bli kodblind! Java. tips Med Java. kom Generics som gör att man bla kan använda sig av typade containers. Detta gör att man slipper den jobbiga konstruktionen med downcasting. Gamla sättet (<.) att göra en typisk iterering över en Collection på: // Otypad lista List songs = new ArrayList(); // Iterera genom listan Iterator it = songs.iterator(); while (it.hasnext()) { // Här måste vi typkonvertera eftersom it.next() // returnerar Object Song s = (Song) it.next(); s.sing(); Informationsteknologi #9 Informationsteknologi #

Java. - ny for-loop Med. kan man istället göra så här: // Lista som enbart kan innehålla objekt av typen Song List<Song> songs = new ArrayList<Song>(); // Iterera genom listan med den nya for-loopen: for (Song s : songs) { // För alla Song s i songs s.sing(); Det blir inte bara mindre att skriva, utan man får också compile-time typcheck istället för run-time. Man kan använda den nya for-loop:en även för arrayer. Java. Mer om generics Om man är intresserad av att lära sig mer om generics så rekomenderas länken på hemsidan som behandlar nyheterna i Java.. Vill man skriva egna klasser som använder generics är det ett tips att titta på implementationen av klasserna i java.util. Informationsteknologi # Informationsteknologi # Exempel på filsökningsfunktion private int addfiles(file[] files, double progress, double totalprogress, int pos) { double partprogress = totalprogress / (double) files.length; for (File f : files) { if (f.isdirectory()) { // Add directory content recursively pos = addfiles(f.listfiles(), progress, partprogress, pos); else if (f.isfile()) { // Add the file to the playlist if it is an mp file String filename = f.getname().tolowercase(); int i = filename.lastindexof(".mp"); if (i >= ) { Song s = Song.createSong(f); if (s!= null) { if (pos >= ) { playlistmodel.addsong(pos, s); pos++; else playlistmodel.addsong(s); progress += partprogress; log.debug("p: " + progress); return pos; // Exempel som lägger till filerna först i spellistan: addfiles(filechooser.getselectedfiles(),.,., ); Olika approacher för fil-letandet Föregående funktion lägger till låtar samtidigt som den scannar igenom. Man kan då inte på förhand veta exakt vad varje steg i progressbaren ska motsvara, utan man får istället göra gissningar. Detta gör att progressbaren kommer stega fram olika fort beroende på antalet filer i en katalog. Alternativet är att man gör det som en tvåstegsoperation där man först scannar genom alla kataloger (då kan progress-baren vara indeterminate) för att sen (när man vet hur många filer man har) visa helt korrekt progress. Båda varianterna har sina för- och nackdelar. Använd vilken ni vill. Informationsteknologi # Informationsteknologi # Drag and drop Frivilligt på uppgiften Lite klurigt Men man kan med enkla medel få relativt schysst beteende. Exempel: Vi vill kunna släppa filer från vår filhanterare på vår playlist. Detta är egentligen bara en drop-operation, vilket gör det lite enklare för oss. Exempel: Släppa filer på playlist Först vill vi skapa en DropTargetListener: DropTargetListener tabledtl = new DropTargetAdapter() { public void drop(droptargetdropevent e) { try { Transferable tr = e.gettransferable(); if (tr.isdataflavorsupported(dataflavor.javafilelistflavor)) { e.acceptdrop(dndconstants.action_copy_or_move); Point point = e.getlocation(); java.util.list<file> filelist = (java.util.list) tr.gettransferdata(dataflavor.javafilelistflavor); if (playlisttable!= null) { int row = playlisttable.rowatpoint(point); addfiles(filelist, row); else addfiles(filelist, -); else { log.debug("rejecting: " + e.getcurrentdataflavorsaslist()); e.rejectdrop(); catch (Exception ex) { e.rejectdrop(); ; Informationsteknologi # Informationsteknologi #

Skapa DropTarget Därefter skapar vi en DropTarget och sätter den på tabellen. DropTarget tabledroptarget = new DropTarget(playlistTable, tabledtl); playlisttable.setdroptarget(tabledroptarget); Detta är allt som behövs för att det ska fungera att släppa på tabellen. Det finns dock ett problem: innan tabellen har några rader så träffar man istället den omgivande JScrollPane:en med sina drops Lösningen är att skapa en nästan likadan DropTarget och sätta denna på själva JScrollPane:n: Tips: Sätta kolumnbredder Självklart vill man att sin playlist har rätt bredd på respektive kolumn. Problemet är att rätt bredd kan ändras under körning. Hur ska vi få reda på när bredden måste sättas om? DropTarget scrolldroptarget = new DropTarget(scrollPane, scrolldtl); scrollpane.setdroptarget(scrolldroptarget); Informationsteknologi #7 Informationsteknologi # Tips: Sätta kolumnbredder Vi kan registrera en lyssnare på modellen och se till att göra något smart när modellen ändras: playlistmodel.addtablemodellistener(new TableModelListener() { public void tablechanged(tablemodelevent e) { if (playlistmodel!= null && playlisttable!= null) { int rows = playlistmodel.getrowcount(); FontMetrics fm = playlisttable.getfontmetrics(playlisttable.getfont()); int w = fm.stringwidth(integer.tostring(rows) + ""); TableColumn col = playlisttable.getcolumn(lang.get("player.playlist.index")); if (col!= null) { col.setminwidth(w); col.setmaxwidth(w + ); ); Tips: Sätta kolumnbredd Självklart bör man kolla vilket sorts event som kommer och enbart ändra kolumnbredden om eventet är av en sån typ att bredden kan ha ändrats. Informationsteknologi #9 Informationsteknologi # 7