GUI$Applica+ons$ Concurrent$Swing$ Niklas$Fors$ 2013>11>13$ - - PowerPoint PPT Presentation

gui applica ons
SMART_READER_LITE
LIVE PREVIEW

GUI$Applica+ons$ Concurrent$Swing$ Niklas$Fors$ 2013>11>13$ - - PowerPoint PPT Presentation

GUI$Applica+ons$ Concurrent$Swing$ Niklas$Fors$ 2013>11>13$ Swing$$A$GUI$framework$in$Java$ Swing$ Swing$is$ single'threaded $ Android$UI,$SWT,$QT,$MacOS$Cocoa,$X$Windows$ (However,$there$are$some$methods$that$are$


slide-1
SLIDE 1

GUI$Applica+ons$

Concurrent$Swing$

Niklas$Fors$ 2013>11>13$

slide-2
SLIDE 2

Swing$–$A$GUI$framework$in$Java$

slide-3
SLIDE 3

Swing$

  • Swing$is$single'threaded$

– Android$UI,$SWT,$QT,$MacOS$Cocoa,$X$Windows$ – (However,$there$are$some$methods$that$are$ thread>safe…)$

  • GUIs$are$event'driven$(mouse$click,$…,)$

– Register$event$listeners$$

slide-4
SLIDE 4

Register$event$listener$

! JButton!button!=!...;! button.addActionListener(new!ActionListener()!{! !!public*void!actionPerformed(ActionEvent!e)!{! !!!!//!Do!something!useful!here! !!}! });! !

slide-5
SLIDE 5

Event$Dispatch$Thread$

  • Manipula+ons$of$the$GUI$state$should$be$

done$in$the$Event/Dispatch/Thread/(EDT)/(or$ the$Swing$thread)$$

  • EDT$~$Executors.newSingleThreadExecutor()!
slide-6
SLIDE 6

Overview$

GUI/objects/ Event// Dispatch/ Thread/ Other/threads/ Work/queue/ queue work$ get$ work$ perform$work$and$ process$events$ GUI/

slide-7
SLIDE 7

Other$thread$>>$Swing$

! //!synchronous!! SwingUtilities.invokeAndWait(Runnable!r);! ! //!asynchronous! SwingUtilities.invokeLater(Runnable!r);! ! interface!Runnable!{! !!public*void!run();! }!

slide-8
SLIDE 8

Other$thread$>>$Swing$

class!MyThread!extends!Thread!{! !!private!final!JLabel!label;! !!public!MyThread(JLabel!label)!{!! !!!!this.label!=!label;! !!}! ! !!public!void!run()!{! !!!!final*int!x!=!veryComplicatedComputation();! ! ! ! ! ! ! ! !!}! }! SwingUtilities.invokeLater(new!Runnable()!{! !!public*void!run()!{! !!!!label.setText(String.valueOf(x));! !!}! });$

slide-9
SLIDE 9

Long>running$tasks$

  • Do$not$run$long>running$tasks$in$the$EDT!!!$

– The$GUI$will$freeze!$

  • Run$long>running$tasks$in$other$threads$

– SwingWorker$ – Executor$framework$(ask$Alma!)$ – …$

slide-10
SLIDE 10

Long>running$tasks$

  • Use$SwingWorker$(or$the$Executor/framework)$

$ $

abstract*class!SwingWorker<T,V>!extends!...!{! !!//!run!code!in!a!worker!thread! !!protected*abstract*T!doInBackground();!! ! !!//!run!code!in!the!EDT! !!protected!void!done();! ! !!//!schedule!this!work!in!a!work!thread! !!public*void!execute();! !!...! }! $

slide-11
SLIDE 11

Ini+al$thread$

public*class!Test!{! !!public*static*void*main(String!args[])!{! !!!!//!This!code!is!running!in!the!initial*thread* !!}! }!

slide-12
SLIDE 12

Conclusion$

  • Swing$is$a$single'threaded/framework$
  • Run$short>running$tasks$that$modify$the$GUI$in$

the$EDT$

  • Do/not/run$long>running$tasks$in$the$EDT$

– The$GUI$will$freeze$ – Use$SwingWorker$(or$something$else)$

slide-13
SLIDE 13

Exercise$–$IsItFika?$

  • All$GUI$changes$should$be$done$by$the$EDT$

– (Even$the$crea+on$of$the$GUI)$

  • Implement$the$Refresh$bu^on$$

– Use$SwingWorker$(RTFM)$ – Add$loading$text$that$is$displayed$during$loading$ – Disable$Refresh$bu^on$during$loading$ – Add$delay$(e.g.,$500$ms)$to$simulate$network$ delay$

slide-14
SLIDE 14

http://fileadmin.cs.lth.se/cs/Education/EDA015F/2013/Ch9-IsItFika.java