Swing jSlider soll selber weiterwandern, je nach zeit der musik

Ich habe einen Slider entworfen mit dem man schon vor und zurückspulen kann im musikstück. und auch das musikstück spielt dann die richtige stelle ab.

Doch wenn ich den zeiger am slider nicht anfasse sollte er von alleine wandern, jenachdem bei welcher sekunde gerade das musikstück ist. Aber ich steh auf dem schlauch, wie ich das hinbekommen soll.

Java:
         final JLabel ende = new JLabel();
         final JSlider slider1 = new JSlider(0,0,0);// Von,bis,anfangsposition
         slider1.setBorder(null);
         slider1.setPaintTicks(false);
         slider1.setPaintLabels(false);
         slider1.setOpaque(false);

      // Register a change listener
         slider1.addChangeListener(new ChangeListener()
         {
             // This method is called whenever the slider's value is changed
        	 public void stateChanged(ChangeEvent evt) 
             {
                 JSlider slider = (JSlider)evt.getSource();
                 if (!slider.getValueIsAdjusting()) 
                 {
                     // Get new value
                     long value = (long)slider.getValue();
                     musik.setPositionInMikrosekunden(value*1000000);
                 }
             }
         });
/***********************************/

// weiter unen im code wenn man den button play drückt

button[0].addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e)
            {
            	musik = new Sound("D:/AA-Kino/Takedown.wav");
            	sec = musik.getLaengeInSekunden();
            	slider1.setMaximum(sec);
            	setStdMinSek(sec);
            	ende.setText(""+std+":"+min+":"+sec);
            	musik.play();
            }
        });
 
Du brauchst einen [JAPI]http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html[/JAPI], der dann jede Zeiteinheit (z.B. alle Millisekunden oder alle 10 Millisekunde (besser)) abfrag, wie weit die Musik ist und danach den JSlider den Wert setzt. Allerdings müsstest du bei deinem jetzigen Code da unbedingt noch ein Flag einbauen, dass wenn der Wert von deinem Timer geändert wurde, die Musik nicht verändert wird, also:
Java:
// changeFromTimer ist eine Klassenvariable vom Typ boolean
// Beide folgende Codeteile müssen Zugriff auf diese haben - kann (und sollte) auch über
// Getter und Setter erfolgen - hier direkter Zugriff

// In der stateChanged des JSliders
if(!changeFromTimer) {
    // Get new value
    long value = (long)slider.getValue();
    musik.setPositionInMikrosekunden(value*1000000);
}

// In der actionPerformed des Timers:
changeFromTimer = true;
deinSlider.setValue(derErrechneteWert);
changeFromTimer = false;
 
ja hmm soweit so gut. Aber entweder mach ich nochwas falsch oder aber.... die musik ruckel in dem moment wo der pfiel des sliders sich neu setzt.
Java:
// Schieberegler für Musikposition erstellen
         final JSlider slider1 = new JSlider(0,0,0);// Von,bis,anfangsposition
        // slider1.setAlignmentX(Component.RIGHT_ALIGNMENT);
        // slider1.setPaintTrack( false );
         //slider1.setPreferredSize(new Dimension(400, 60));
         slider1.setBorder(null);
         slider1.setPaintTicks(false);
         slider1.setPaintLabels(false);
         slider1.setOpaque(false);
         
      // Register a change listener
         slider1.addChangeListener(new ChangeListener()
         {
             // This method is called whenever the slider's value is changed
        	 public void stateChanged(ChangeEvent evt) 
             {
                 JSlider slider = (JSlider)evt.getSource();
                 if (!slider.getValueIsAdjusting()) 
                     musik.setPositionInMikrosekunden((long)slider.getValue()*1000000);
                 
                // egal ob true oder false es ruckelt
                 if(!changeFromTimer) 
                	 musik.setPositionInMikrosekunden((long)slider.getValue()*1000000);
                
             }
         });

         ActionListener taskPerformer = new ActionListener() {
             public void actionPerformed(ActionEvent evt)
             {
            	 changeFromTimer = true;
            	 slider1.setValue(slider1.getValue()+1);
            	 //System.out.println("Wert: " + slider1.getValue());
            	 changeFromTimer = false;
             }
         };
         new Timer(1000, taskPerformer).start();

weiter unten ausserhalb dieser klasse

Java:
 boolean changeFromTimer = false;
    private void setChanger()
    {
    	if (changeFromTimer == false)
    		changeFromTimer = true;
    	else
    		changeFromTimer = false;
    }
    private boolean getChanger()
    {
    	return changeFromTimer;
    }
 
Zuletzt bearbeitet:
okay hab es soweit hinbekommen, aber was nun aufgetaucht ist, ist folgendes. wenn ich den zeiger anfasse mit der mouse und ihn hin und herschiebe aber noch nicht loslasse und somit die musik ja noch an der alten stelle spielen müsste und erst dann auf die neue wechseln sollte wenn man loslässt. (ja das geht auch) aber während des ziehens ruckelt die musik und versucht sich schon der neuen stell anzupassen BEVOR ich die mouse wieder losgelassen habe. wie kann ich das verhindern?
Java:
 slider1.addChangeListener(new ChangeListener()
         {
             // This method is called whenever the slider's value is changed
        	 public void stateChanged(ChangeEvent evt) 
             {
                 JSlider slider = (JSlider)evt.getSource();
// dieser befehl war überflüssig
              /*  if (!slider.getValueIsAdjusting()) 
                     musik.setPositionInMikrosekunden((long)slider.getValue()*1000000);*/
                 
                 if(!getChanger()) 
                	 musik.setPositionInMikrosekunden((long)slider.getValue()*1000000);
                
             }
         });
         
         final ActionListener taskPerformer = new ActionListener() {
             public void actionPerformed(ActionEvent evt)
             {
            	 setChanger(); // true
            	 slider1.setValue(musik.getPositionInSekunden());
            	// System.out.println("Wert: " + slider1.getValue() + "position"+ musik.getPositionInSekunden());
            	 setChanger(); // false
             }
         };
 
ja manchmal sollte man eine Nacht darüber schlafen, wenn man schon STuden vor dem Probelm saß. Kalppt jetzt alles wuder bar danke. Hab es so geändert (für alle anderen die hier mitlesen)

PHP:
  if(!getChanger() && !slider.getValueIsAdjusting()) 
                	 musik.setPositionInMikrosekunden((long)slider.getValue()*1000000);
 

Zurück
Oben