samedi 9 mai 2015

JSlider - Wert ändern im Sekundentakt per Thread

Hallo!

Ich habe hier einen JSlider, sein Knauf steht auf 10. Ich will, dass er im Sekundentakt um einen Wert absteigt. Dabei heißt es ja, dass Swing nicht threadsicher ist, und für GUI-Manipulationen spezielle Methoden vonnöten sind. Ich habe es gerade mit EventQueue.invokeLater versucht, sowas wird auch auf vielen Seiten empfohlen. Dennoch klappt es nicht, es kommt immer eine Fehlermeldung – eine NullPointerException. Mein Slider wird in der Thread-Klasse anscheinend nicht erkannt.

Kann sein, dass das Problem auch nicht direkt an dem Thread-Code selbst, sondern an meiner Technik liegt, Sachen aus fremden Klassen anzusteuern. Vermute ich jetzt mal.

Hier ist der Code, die Fehlermeldung richtet sich gegen den Inhalt der invokeLater-run-Methode (Zeile 58). Was mache ich da falsch?



Java Code:

  1. import java.awt.EventQueue;
  2.  
  3. import javax.swing.JFrame;
  4. import javax.swing.JLabel;
  5. import javax.swing.JPanel;
  6. import javax.swing.JSlider;
  7. import javax.swing.event.ChangeEvent;
  8. import javax.swing.event.ChangeListener;
  9.  
  10. public class app {
  11.  
  12. JFrame Rahmen; JPanel bg; JSlider s; JLabel anzeigeL;
  13.  
  14. public static void main(String[] args) { new app().gui(); }//main()
  15.  
  16. public void gui(){
  17. Rahmen = new JFrame("App");
  18. bg = new JPanel(); Rahmen.add(bg);
  19.  
  20. s = new JSlider(JSlider.HORIZONTAL, 0,10,10); bg.add(s);
  21. s.addChangeListener(new anzeigeLListener());
  22. anzeigeL = new JLabel("10");
  23. bg.add(anzeigeL);
  24.  
  25.  
  26. Thread t = new Thread(new decreaseT()); t.start();
  27.  
  28.  
  29.  
  30.  
  31. Rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  32. Rahmen.setBounds(700,0,1000,1000); Rahmen.setVisible(true);
  33. }//gui()
  34.  
  35.  
  36. public class anzeigeLListener implements ChangeListener
  37. {public void stateChanged(ChangeEvent e){
  38.  
  39. anzeigeL.setText(""+s.getValue());
  40.  
  41. }}//anzeigeLListener
  42.  
  43.  
  44. public JSlider getS(){
  45. return s;
  46. }//getS()
  47.  
  48.  
  49.  
  50. }//class app
  51.  
  52.  
  53. class decreaseT implements Runnable{
  54.  
  55. public void second()
  56. {try{
  57. Thread.sleep(1000);
  58. }catch(Exception e){}//try/catch()
  59. System.out.println("second");
  60.  
  61. EventQueue.invokeLater(new Runnable(){public void run(){
  62. JSlider s = new app().getS(); s.setValue(3);
  63. }});//invokeLater()
  64.  
  65. }//second()
  66.  
  67. public void run(){
  68.  
  69. for(int i=0; i<4; i++){second(); }//FOR
  70.  
  71. }//run()
  72.  
  73. }//class decreaseT


JSlider - Wert ändern im Sekundentakt per Thread

0 commentaires:

Enregistrer un commentaire