Thread.sleep

Jvooy

Mitglied
Hallo zusammen,

ich bin schon seit einer gefühlten Ewigkeit am Suchen.

Ich würde gerne, wenn ich auf einen Button drücke, dass dann in Abständen von ca. 5sec sich die Farbe von Labels ändert.

Java:
package Übung;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Blink {
		
	private JLabel lb1 = new JLabel();
	private JLabel lb2 = new JLabel();
	private JLabel lb3 = new JLabel();
	private JLabel lb4 = new JLabel();
	private JLabel lb5 = new JLabel();
	
	private JButton btLeuchte = new JButton();
	
	public void Oberflaeche()
	{
		JFrame frame = new JFrame();
		JPanel panel = new JPanel();

		lb1.setOpaque(true);
		lb2.setOpaque(true);
		lb3.setOpaque(true);
		lb4.setOpaque(true);
		lb5.setOpaque(true);
		
		lb1.setBounds(50, 50, 50, 50);
		lb2.setBounds(100, 100, 50, 50);
		lb3.setBounds(150, 150, 50, 50);
		lb4.setBounds(200, 200, 50, 50);
		lb5.setBounds(250, 250, 50, 50);
		
		btLeuchte.setBounds(1, 1, 50, 50);
		btLeuchte.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				
				lb1.setBackground(Color.BLUE);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
				
				lb2.setBackground(Color.BLUE);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
				lb3.setBackground(Color.BLUE);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				lb4.setBackground(Color.BLUE);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				lb5.setBackground(Color.BLUE);
			}
		});
		
		lb1.setBackground(Color.RED);
		lb2.setBackground(Color.RED);
		lb3.setBackground(Color.RED);
		lb4.setBackground(Color.RED);
		lb5.setBackground(Color.RED);
		
		panel.add(lb1);
		panel.add(lb2);
		panel.add(lb3);
		panel.add(lb4);
		panel.add(lb5);
		
		panel.add(btLeuchte);
		
		frame.add(panel);
		
		panel.setLayout(null);
		
		frame.setSize(800, 800);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
 
du musst bei Thread.sleep die zu Millisekunden angeben die verstreichen sollen. Sprich bei 5 Sekunden wären das 5000 und nicht 500 (ist nur eine halbe Sekunde)

in der actionPerformed methode könntest du noch code sparen, wenn du die labels in ein array geben würdest und mittels schleife drüberläufst.

und nun noch ein Frage ... 😉
Funktioniert etwas nicht? Hast du eine Frage? Oder wolltest du nur mitteilen was du mit dieser Klasse tun wolltest?:bahnhof:
 
Zuletzt bearbeitet von einem Moderator:
Hi!

Die Klasse "Timer" aus Swing macht, was du benötigst, ohne den EDT und damit die GUI zu blockieren.

Gruß!
 
Die Frage besteht darin, dass die Labels sich nach dem drücken des Buttons jeweils nach 5sec Blau färben sollten 😉

Im obrigen Code werden alle Labels nach dem drücken des Button gleichzeitig blau.
 
Ich habe dir hierzu schon die Antwort gegeben, du wechselt die Farbe schon nach 500 Millisekunden!
Sprich nach 2 1/2 Sekunden sind alle Blau. Änder die Zahl jeweils auf 5000 dann passt es ... wenn du dann auch noch das von noobadix beachtest. 😉
 
Zuletzt bearbeitet von einem Moderator:
Kp was ich falsch mache, aber auch wenn ich des sleep auf 5000 erhöhe rattert er alle nach 5000 direkt runter und nicht label für label


1.Label -> 5000sec -> 2.Label -> 5000sec -> 3.Label -> 5000sec... etc.
 
> wenn ich des sleep auf 5000 erhöhe rattert er alle nach 5000 direkt runter und nicht label für label
du meinst nach 25 sec wechseln alle, oder?

wie schon gesagt wurde brauchst du aufwendig einen separaten Thread, weil du im Moment die GUI blockierst,
die kann erst wieder malen/ reagieren, wenn der ActionListener fertig ausgeführt ist, und dann sind schon alle blau..

----

Methoden klein schreiben!

selbst wenn du bei einzelnen Befehlen bleibst, ist es doch Irrsinn, 4x das dicke try/catch zu schreiben,
definiere dir eine Methode sleep(Zeit), dann wäre es jeweils nur eine kleine Zeile
 
Hier kau ich dir was vor, um ja auch etwas anzugeben. ^^

Wichtig ist, dass du das mit dem EDT verstehst. Lies dazu mal: Threads and Swing

Hier mit Timer:

Java:
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
 
public class FunnyLabelsDemo{
        
    private Vector<JLabel> labels = new Vector<JLabel>();
    private JButton btLeuchte = new JButton();
    private int delayInMs = 5000,labelCount=5;
    private MyTimer myTimer;
    
    public static void main(String[] args){
    	FunnyLabelsDemo fld = new FunnyLabelsDemo();
    }
    
    public FunnyLabelsDemo(){
        JFrame frame = new JFrame();
        myTimer = new MyTimer();
        JPanel panel = new JPanel();
        
        int x=50,y=50;
        for(int i=0;i<labelCount;i++){
        	JLabel label = new JLabel();
        	label.setOpaque(true);
        	label.setBounds(x,y,50,50);
        	label.setBackground(Color.RED);
        	labels.add(label);
        	panel.add(labels.lastElement());
        	x+=50;
        	y+=50;
        }
        panel.add(btLeuchte);
        panel.setLayout(null);
        
        btLeuchte.setBounds(1, 1, 50, 50);
        btLeuchte.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            	myTimer.start();
            }
        });
        
        frame.add(panel);
        frame.setSize(800, 800);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    class MyTimer{
    	Timer timer;
    	private int labelIterator=0;
    	
    	public MyTimer(){
    		timer = new Timer(delayInMs,new MyTimerListener());
    	}
    	
    	public void start(){
    		labelIterator = 0;
    		timer.start();
    	}
    	
    	public void stop(){
    		timer.stop();
    	}
    	
	    class MyTimerListener implements ActionListener{
	    	public void actionPerformed(ActionEvent e){
				if(labelIterator==labelCount){
					timer.stop();
					return;
				}
				labels.elementAt(labelIterator++).setBackground(Color.BLUE);
	    	}
	    }
    }
}

Da mit SwingWorker:

Java:
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
 
public class FunnyLabelsDemo{
        
    private Vector<JLabel> labels = new Vector<JLabel>();
    private JButton btLeuchte = new JButton();
    private int delayInMs = 5000,labelCount=5;
    
    public static void main(String[] args){
    	FunnyLabelsDemo fld = new FunnyLabelsDemo();
    }
    
    public FunnyLabelsDemo(){
        final JFrame frame = new JFrame();
        JPanel panel = new JPanel();
 
        int x=50,y=50;
        for(int i=0;i<labelCount;i++){
        	JLabel label = new JLabel();
        	label.setOpaque(true);
        	label.setBounds(x,y,50,50);
        	label.setBackground(Color.RED);
        	labels.add(label);
        	panel.add(labels.lastElement());
        	x+=50;
        	y+=50;
        }
        panel.add(btLeuchte);
        panel.setLayout(null);
        
        btLeuchte.setBounds(1, 1, 50, 50);
        btLeuchte.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            	MySwingWorker msw = new MySwingWorker();
                msw.execute();
            }
        });
        
        frame.add(panel);
        frame.setSize(800, 800);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    private class MySwingWorker extends SwingWorker{
    	public String doInBackground(){
    		for(JLabel label : labels){
    			label.setBackground(Color.BLUE);
    			try {
                    Thread.sleep(delayInMs);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    		}
    		return "";
    	}
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben