Ampel

Milkaselnuss

Aktives Mitglied
Hallo,
ich arbeite grade aus Spass an einem Ampelprogramm.
Das ganze soll halt wie eine echte Ampel funktionieren (bin mit dem Code noch nicht ganz fertig^^)

Java:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Ampel extends JFrame implements ActionListener {

	JLabel label01;
	JLabel label02;
	JLabel label03;
	JLabel label04;
	JLabel label05;
	JLabel label1;
	JLabel label2;
	JLabel label3;
	JLabel label4;
	JLabel label5;
	JLabel label6;
	JLabel label7;
	JLabel label8;
	JLabel label9;
	JLabel label10;
	JLabel label11;
	JLabel label12;
	JLabel label13;
	JButton button;
	JLabel label14;
	JLabel label15;
	JLabel label16;
	JLabel label17;
	JLabel label18;
	JLabel label19;
	
	boolean started = false;
	Icon icon_grey = new ImageIcon("../program_files/icon_grey.gif");
	Icon icon_red = new ImageIcon("../program_files/icon_red.gif");
	Icon icon_yellow = new ImageIcon("../program_files/icon_yellow.gif");
	Icon icon_green = new ImageIcon("../program_files/icon_green.gif");

	public Ampel() {
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(5, 3));
		label01 = new JLabel("");
		label02 = new JLabel("");
		label03 = new JLabel("");
		label04 = new JLabel("");
		label05 = new JLabel("");
		label1 = new JLabel("Fußgängerampel:");
		label2 = new JLabel("");
		label3 = new JLabel("Autoampel:");
		label4 = new JLabel("");
		label4.setOpaque(true);
		label4.setBackground(Color.black);
		label4.setIcon(icon_grey);
		label5 = new JLabel("");
		label6 = new JLabel("");
		label6.setOpaque(true);
		label6.setBackground(Color.black);
		label6.setIcon(icon_grey);
		label7 = new JLabel("");
		label7.setOpaque(true);
		label7.setBackground(Color.black);
		label7.setIcon(icon_grey);
		label8 = new JLabel("");
		label9 = new JLabel("");
		label9.setOpaque(true);
		label9.setBackground(Color.black);
		label9.setIcon(icon_grey);
		label10 = new JLabel("");
		label11 = new JLabel("");
		label12 = new JLabel("");
		label12.setOpaque(true);
		label12.setBackground(Color.black);
		label12.setIcon(icon_grey);
		button = new JButton("Bitte Ampel starten");
		button.addActionListener(this);
		label13 = new JLabel("");
		label14 = new JLabel("");
		label15 = new JLabel("");
		label16 = new JLabel("");
		label17 = new JLabel("");
		label18 = new JLabel("");
		label19 = new JLabel("");
		panel.add(label01);
		panel.add(label1);
		panel.add(label2);
		panel.add(label3);
		panel.add(label15);
		panel.add(label02);
		panel.add(label4);
		panel.add(label5);
		panel.add(label6);
		panel.add(label16);
		panel.add(label03);
		panel.add(label7);
		panel.add(label8);
		panel.add(label9);
		panel.add(label17);
		panel.add(label04);
		panel.add(label10);
		panel.add(label11);
		panel.add(label12);
		panel.add(label18);
		panel.add(label05);
		panel.add(label13);
		panel.add(button);
		panel.add(label14);
		panel.add(label19);

		setContentPane(panel);
	}

	public void actionPerformed(ActionEvent Ereignis) {
		Object Quelle = Ereignis.getSource();

		if (Quelle == button && started == true) {
			try {
				System.out.println("Requesting...");
				Thread.sleep(1000);
				label12.setIcon(icon_grey);
				label9.setIcon(icon_yellow);
				Thread.sleep(1600);
				label9.setIcon(icon_grey);
				label6.setIcon(icon_red);
				Thread.sleep(1000);
				System.out.println("Changing to Green...");
				label4.setIcon(icon_grey);
				label7.setIcon(icon_green);
				Thread.sleep(500);
				System.out.println("Done...");
				Thread.sleep(5000);
				System.out.println("Changing to Red in 5 Seconds...");
				Thread.sleep(5000);
				System.out.println("Changing..");
				label7.setIcon(icon_grey);
				label4.setIcon(icon_red);
				Thread.sleep(100);
				System.out.println("Done..");
				Thread.sleep(1400);
				label9.setIcon(icon_yellow);
				Thread.sleep(2000);
				label6.setIcon(icon_grey);
				label9.setIcon(icon_grey);
				label12.setIcon(icon_green);
				
			} catch (InterruptedException e) {

				e.printStackTrace();
			}
		}

		if (Quelle == button && started == false) {

			try {
				System.out.println("Starting...");
				label4.setIcon(icon_red);
				label12.setIcon(icon_green);
				started = true;
				button.setText("Anfrage");
				Thread.sleep(1000);
				System.out.println("Started");
				System.out.println("");
			} catch (InterruptedException e) {

				e.printStackTrace();
			}
		}

	}

	public static void main(String[] args) {

		Ampel ampel = new Ampel();
		ampel.setSize(510, 510);
		ampel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		ampel.setVisible(true);
		ampel.setLocationRelativeTo(null);
	}

}
Hauptcode ab 120!


Allerdings habe ich hier ein Problem. Und zwar Läuft das Programm die Schleife immer erst ganz durch, wodurch sich die Anzeige der Ampel nicht verändert. Wie kann ich also nach jedem Thread.sleep bzw. davor die Labels aktualisieren?

Ich hoffe, dass klar ist was ich meine,


MFG Milkaselnuss
 
G

Gast2

Gast
Du blockierst mit deiner langwierigen actionPerformed Methode den EDT (der ist fürs neuzeichnen deiner GUI zuständig). Du musst den Code in nem separaten Thread ausführen:

Java:
public void actionPerformed(ActionEvent Ereignis) {
  new Thread(new Runnable() {
    public void run() {
      // Dein Code
    }
  }).start();
}
Wenn mans dann noch richtig machen will, dann müssen die Aufrufe die die GUI ändern (setIcon, setText) wieder auf dem EDT aufgerufen, das kann man mit dem SwingWorker machen.
 

Nardian

Bekanntes Mitglied
Hi

1. ist das keine schleife :p
2. variablennamen könnte man auch sinnvoller bezeichnen :D
(oke - genug genörgelt)
3. [hier stand müll - EikeB hat recht]

MfG

//edit: EikeB habs gesehn ^^ edit ist schon was fieses :p
 
G

Gast2

Gast
Dann empfehle ich dir ein Swing Tutorial, bzw. Grundlagen (je nachdem wie weit du schon bist).
 

Marco13

Top Contributor
Nein, statt
Java:
public void actionPerformed(ActionEvent Ereignis) {
    irgendwasWasLangeDauertOderSleepEnthält();
}
sollte man
Java:
public void actionPerformed(ActionEvent Ereignis) {
  new Thread(new Runnable() {
    public void run() {
      irgendwasWasLangeDauertOderSleepEnthält();
    }
  }).start();
}
verwenden, aber das Ändern der Labels sollte dann wieder mit SwingUtilities.invokeLater auf dem EDT gemacht werden:
Java:
label12.setIcon(icon_grey);
ändern in
Java:
setLabelIcon(label12, icon_grey);

// Wobei
private static void setIconLabel(final JLabel label, final Icon icon)
{
    SwingUtilities.invokeLater(new Runnable() 
    {
        @Override
        public void run()
        {
            label.setIcon(icon);
        }
    });
}
 

Mujahiddin

Top Contributor
Java:
setLabelIcon(label12, icon_grey);

// Wobei
private static void setIconLabel(final JLabel label, final Icon icon)
{
    SwingUtilities.invokeLater(new Runnable() 
    {
        @Override
        public void run()
        {
            label.setIcon(icon);
        }
    });
}

Du hast die Methodennamen vertauscht.
Übrigens, um abzusichern, dass man zur Zeit nicht bereits im EDT ist, kann man folgendes machen:

Java:
if(!SwingUtilities.isEventDispatchThread())
    SwingUtilities.invokeLater( doRun );
 

pl4gu33

Top Contributor

setLabelIcon != setIconLabel meinte er :p

aber um dich mal aus dem anderen Thread zu zitieren :D

Vorsicht, man muss damit rechnen, dass da sowas rauskommt wie
:) :)
Java:
lbl2.setLabelIcon(label12, icon_grey);
 
// Wobei
private static void setIconLabel(final JLabel label, final Icon icon)
{
    SwingUtilities.invokeLater(new Runnable() 
    {
        @Override
        public void run()
        {
            label.setIcon(icon);
        }
    });
}
 
Zuletzt bearbeitet:

Nardian

Bekanntes Mitglied
Java:
new Thread(new Runnable() {
    public void run() {
      irgendwasWasLangeDauertOderSleepEnthält();
    }
  });

erzeugt nur ein neues objekt Thread, aber es läuft noch nicht. (komischer vergleich, ich weiß, aber: ) ist wie wenn du ein programm installierst, aber es nich startest. es ist da, und wartet. mit thread.start(); beginnts dann zu laufen (in einem eigenen Thread, blockiert also nichts weiter). Soll auch heißen dass der .start() aufruf nicht (bzw wenn dann nur sehr kurz, unabhängig vom inhalt des thread) blockiert.
 

Marco13

Top Contributor
Was bringt denn das .start(); ?

Ich vermute mal, die Frage hat mit der Schreibweise zu tun. Statt
Java:
new Thread(new Runnable() { ... } ).start();
bevorzuge ich auch das IMHO etwas klarere und übersichtlichere (und, wenn man den Thread z.B. noch als Daemon setzen will, auch notwendige)
Java:
Thread thread = new Thread(new Runnable() { ... } );
thread.start();
 

Ähnliche Java Themen

Neue Themen


Oben