Thread künstlich verlängern

Tweaker

Mitglied
Hallo ich bins wieder, mit einem neuen Problem.
Ich will einen thread für eine bestimmte Zeit einfach laufen lassen ohne das noch Aktion besteht. Also 2-3 sekunden.
Anhalten möchte ich ihn aber nicht, das klappt nicht. Also fällt thread.sleep weg. Mit den timerklassen habe ich auch schon rumprobiert, der normalen und der von swing. Habe aber auch nichts gefunden. Es soll lediglich eine gifanimation zuende geführt werden in dem thread. Also nur ein bild.
Es soll auch nur dem Auge dienen dann,die ganze Arbeit tut der thread ja nur eben "zu schnell"

Schöner Tag noch
 
Java:
btnPlay.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				a.start();
				
				
				
			}

		});

Ist jetzt der Button mit Aktion der den Thread starten sollte

Java:
ActionListener b1 = new ActionListener() {
		public void actionPerformed(ActionEvent evt) {
			if ( spass <= 99) 
			spass = spass +1;
			money = money +1;
			label_4.setVisible(false);
			label10.setVisible(true);
			

		}
		
	};
	Timer a = new Timer(100, b1);

hier wird das ganze eingeleitet, was auch gehen würde wäre zwischen dem label10 auch so was wie en down Zähler 2 Sekunden lange und dann wieder die Umstellung von true und false bei den labels. Darüber habe ich bis jetzt noch nicht nachgedacht.
 
Leider zeigt dein Code nichts von der Animation...

Daher gehe ich mal von der Annahme aus, das du ein animiertes GIF meinst.
Die Animation wird unabhängig von deinem Programm "gemalt" und daher weiss dein Programm NICHT, wann die Animation fertig ist und beim letzten Animationsschritt angekommen ist.

Dies kannst du ändern, indem du die Animation auf label10 eine gewisse Mindestzeit anzeigst. Hierfür nehme ich immer den SwingWorker, der nun im Hintergrund einen Thread startet, das Label sichtbar schaltet (via publish im EDT), 3 Sekunden wartet und danach wieder unsichtbar (via publish im EDT) macht. Das sollte garantieren, dass die Animation komplett durchläuft.

Ist übrigens quick-and-dirty code mal schnell zusammengeflickt...
Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingWorker;

public class MeApp extends JPanel {
	public MeApp() {
		setLayout(new BorderLayout());
		final URL url = MeApp.class.getResource("animated.gif");
		final JLabel lbl = new JLabel(new ImageIcon(url));
		lbl.setVisible(false);
		add(lbl, BorderLayout.CENTER);
		final JButton btnPlay = new JButton("Play");
		add(btnPlay, BorderLayout.SOUTH);
		ActionListener al = new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				SwingWorker<Void, Boolean> worker = new SwingWorker<Void, Boolean>() {

					@Override
					protected Void doInBackground() throws Exception {
						try {
							publish(true);
							Thread.sleep(3000);
							publish(false);
						} catch (Exception e) {
							e.printStackTrace();
						}
						return null;
					}

					@Override
					protected void done() {
						lbl.setVisible(false);
					}

					@Override
					protected void process(List<Boolean> chunks) {
						boolean t = false;
						for (Boolean boolean1 : chunks) {
							t = t | boolean1;
						}
						if (t) {
							lbl.setVisible(true);
						} else {
							lbl.setVisible(false);
						}
					}
				};
				worker.execute();
			}
		};
		btnPlay.addActionListener(al);

	}

	public static void main(String[] args) throws Exception {
		final JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		MeApp app = new MeApp();
		frame.getContentPane().add(app);
		frame.pack();
		frame.setVisible(true);
	}
}
 

Zurück
Oben