java - Jbutton flash between two backround colors -


my problem: efficient way program delay in scenario.

my scenario: making quiz game short project, long story short. question answered when user presses 1 of 4 jbuttons having answer on them. quizengine class calls paintbutton method showed here. after proceeds call other methods responsible making next question appear. want make button change between 2 colors decreasing time intervals.

what have tried far: first placed joptionpane between paintbutton method , method changes interface next question see if button change color. did successfully. of course wasn't intention, wanted time interval. tried using thread.sleep. although program wait before changing next question, color change not visible. tried implementation of timer thingy (probably not correctly) although changed color program went ahead , proceeded next question.

my want code

  /* paints button pressed red or green    *  green if anwser correct red if     *  false    *    * @param int bnr number of button    * @param boolean corr true if correct false if false :d    */    public static void paintbutton(int bnr,boolean corr) {         (int i=10;i>1;i--){         b[bnr-1].setbackground(null);              //wait i*100 milliseconds         b[bnr-1].setbackground(corr?color.green:color.red);                  }    } 

let's start basics. swing single threaded, meaning must never block or execute long running code within context of event dispatching thread, make ui freeze , user upset

swing not thread safe, means should never create or update ui outside of context of edt.

this leads problem. want to, after small delay, update ui.

lucky you, there @ least 2 possibilities, swing timer or swingworker.

a swing timer relatively simple, doesn't provide means generate variable delay between updates. swingworker more complex, gives control want.

both of these (can) "wait" outside of edt, both provide means can push updates edt safely.

for example...

blinky

import java.awt.color; import java.awt.dimension; import java.awt.eventqueue; import java.awt.gridbaglayout; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.beans.propertychangeevent; import java.beans.propertychangelistener; import java.util.list; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.swingworker; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception;  public class blinkythebutton {      public static void main(string[] args) {         new blinkythebutton();     }      public blinkythebutton() {         eventqueue.invokelater(new runnable() {             @override             public void run() {                 try {                     uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname());                 } catch (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) {                     ex.printstacktrace();                 }                  jframe frame = new jframe("testing");                 frame.setdefaultcloseoperation(jframe.exit_on_close);                 frame.add(new testpane());                 frame.pack();                 frame.setlocationrelativeto(null);                 frame.setvisible(true);             }         });     }      public class testpane extends jpanel {          private jbutton blinky;          public testpane() {             blinky = new jbutton("blinky");             blinky.setopaque(true);             blinky.addactionlistener(new actionlistener() {                 private blinkworker worker;                 @override                 public void actionperformed(actionevent e) {                     if (worker == null || worker.getstate() == swingworker.statevalue.done) {                         worker = new blinkworker(blinky, color.red);                         worker.addpropertychangelistener(new propertychangelistener() {                             @override                             public void propertychange(propertychangeevent evt) {                                 swingworker worker = (swingworker) evt.getsource();                                 if ("state".equals(evt.getpropertyname())) {                                     if (worker.getstate() == swingworker.statevalue.done) {                                         // call method                                         // update state new question                                     }                                 }                             }                         });                         worker.execute();                     }                 }             });             setlayout(new gridbaglayout());             add(blinky);         }          @override         public dimension getpreferredsize() {             return new dimension(200, 200);         }          public class blinkworker extends swingworker<void, color> {              private jbutton btn;             private color color;             private color normal;              public blinkworker(jbutton btn, color color) {                 this.btn = btn;                 normal = btn.getbackground();                 this.color = color;             }              @override             protected void doinbackground() throws exception {                 (int index = 10; index > 1; index--) {                     publish(color);                     thread.sleep(index * 100);                     publish(normal);                     thread.sleep(index * 100);                 }                 return null;             }              @override             protected void process(list<color> chunks) {                 color color =  chunks.get(chunks.size() - 1);                 btn.setbackground(color);             }          }      }  } 

have @ concurrency in swing, how use swing timers , worker threads , swingworker more details


Comments

Popular posts from this blog

how to insert data php javascript mysql with multiple array session 2 -

multithreading - Exception in Application constructor -

windows - CertCreateCertificateContext returns CRYPT_E_ASN1_BADTAG / 8009310b -