Hallo,
Ich habe ein Problem mit Threads, welches sich im unteren Code zeigt. Aufgabe ist es in zwei Panels eine Ampelanlage zu zeichnen, wobei die beiden Ampeln synchron laufen müssen. Dies soll mit den Buttons Start, Stopp und Ende realisiert werden. Soweit funktioniert es, aber nicht ganz so wie ich es möchte, denn ich möchte zwei Threads erstellen, die in der main-Methode ihre run-Methode haben bzw. finden sollen. Dies mache ich mit t = new Thread(this); wobei die Definition zuvor durchgeführt wurde. Dann versuche ich herauszufinden, ob sie erstellt wurden- mit if(t.isAlive()) etc. ... um sicherzustellen, dass sie existieren, aber das tun sie nicht. Hoffe, dass unten im Code alles klar ist. Wenn ich sie erstelle und im Konstruktor ein Panel angebe, dann existieren sie, andernfalls nicht.
Vielen Dank!
Mit freundlichen Grüßen!
Das ist das Panel:
Nun folgt die main-Methode:
Ich habe ein Problem mit Threads, welches sich im unteren Code zeigt. Aufgabe ist es in zwei Panels eine Ampelanlage zu zeichnen, wobei die beiden Ampeln synchron laufen müssen. Dies soll mit den Buttons Start, Stopp und Ende realisiert werden. Soweit funktioniert es, aber nicht ganz so wie ich es möchte, denn ich möchte zwei Threads erstellen, die in der main-Methode ihre run-Methode haben bzw. finden sollen. Dies mache ich mit t = new Thread(this); wobei die Definition zuvor durchgeführt wurde. Dann versuche ich herauszufinden, ob sie erstellt wurden- mit if(t.isAlive()) etc. ... um sicherzustellen, dass sie existieren, aber das tun sie nicht. Hoffe, dass unten im Code alles klar ist. Wenn ich sie erstelle und im Konstruktor ein Panel angebe, dann existieren sie, andernfalls nicht.
Vielen Dank!
Mit freundlichen Grüßen!
Das ist das Panel:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class JAmpelPanel extends JPanel implements Runnable{
enum Phase {ROT, ROTGELB, GRUEN, GELB, AUS}; //ENUM definiert eine Klasse genauer, der Konstanten übergeben werden- hier die Farben
private Phase phase = Phase.AUS; //Ein Objekt der Klasse Phase wird erstellt
Color coben, cmitte, cunten;
//Ampelphasen:
private int rotPhase = 3000;
private int rotgelbPhase = 500;
private int gruenPhase = 3000;
private int gelbPhase = 3000;
//Variable:
private boolean go;
private boolean f;
//Die paint-Methode:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
setBackground(new Color(0, 80, 0));
switch(phase)
{
case ROT:
coben = Color.red;
cmitte = Color.gray;
cunten = Color.gray;
break;
case ROTGELB:
coben = Color.red;
cmitte = Color.orange;
cunten = Color.gray;
break;
case GRUEN:
coben = Color.gray;
cmitte = Color.gray;
cunten = Color.green;
break;
case GELB:
coben = Color.gray;
cmitte = Color.orange;
cunten = Color.gray;
break;
case AUS:
coben = Color.gray;
cmitte = Color.gray;
cunten = Color.gray;
break;
}
int h = getHeight() / 3-12;
int b = getWidth() - 6;
g.setColor(coben);
g.fillOval(3, 3, b, h);
g.setColor(cmitte);
g.fillOval(3, getHeight() / 3 + 6, b, h);
g.setColor(cunten);
g.fillOval(3, 2 * getHeight() / 3 + 9, b, h);
g.setColor(Color.black);
g.drawOval(3, 3, b, h);
g.drawOval(3, getHeight() / 3+ 6, b, h);
g.drawOval(3, 2 * getHeight() / 3 + 9, b, h);
}
public void setPhase(Phase p)
{
phase = p;
repaint();
}
public void setAus()
{
setPhase(Phase.AUS);
repaint();
}
public void setRot()
{
setPhase(Phase.ROT);
repaint();
}
public void setRotgelb()
{
setPhase(Phase.ROTGELB);
repaint();
}
public void setGelb()
{
setPhase(Phase.GELB);
repaint();
}
public void setGruen()
{
setPhase(Phase.GRUEN);
repaint();
}
@Override
public synchronized void run() {
while(go == true)
{
try
{
setRot();
Thread.sleep(rotPhase);
setRotgelb();
Thread.sleep(rotgelbPhase);
setGruen();
Thread.sleep(gruenPhase);
setGelb();
Thread.sleep(gelbPhase);
}
catch(Exception e1)
{
e1.printStackTrace();
}
}
}
public void setGo(boolean f)
{
go = f;
}
}
Nun folgt die main-Methode:
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class DuoAmpel extends JFrame implements Runnable{
//ContentPane:
private JPanel contentPane;
//Threads:
private Thread t;
private Thread d;
//Panels:
private JAmpelPanel panelAmpelOne;
private JAmpelPanel panelAmpelTwo;
//Buttons:
private JButton btnStop;
private JButton btnStart;
private JButton btnEnde;
//Ampelphasen:
private int rotPhase = 3000;
private int rotgelbPhase = 500;
private int gruenPhase = 3000;
private int gelbPhase = 3000;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DuoAmpel frame = new DuoAmpel();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public DuoAmpel() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
//Title:
setTitle("Zweiampelsteuerung");
//Panels:
panelAmpelOne = new JAmpelPanel();
panelAmpelOne.setBounds(10, 11, 134, 239);
contentPane.add(panelAmpelOne);
panelAmpelTwo = new JAmpelPanel();
panelAmpelTwo.setBounds(154, 11, 134, 239);
contentPane.add(panelAmpelTwo);
//Buttons:
btnStart = new JButton("Start");
btnStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Wird so in der derzeitigen Fassung verwendet:
var f = true;
panelAmpelOne.setGo(f);
t = new Thread(panelAmpelOne);
t.start();
//Sollte eigentlich über den Aufruf der Methode funktionieren- tut es aber nicht:
// Das ist die Methode- findet sich weiter unten: automatik();
//Problem mit Konstruktor, wird nicht erstellt, es wird kein Thread erstellt, wenn ich d = new Thread(this); schreibe:
panelAmpelTwo.setGo(f);
d = new Thread(panelAmpelTwo);
/*if(d.isAlive())
{
System.out.println("d Wurde erstellt");
}*/
d.start();
}
});
btnStart.setBounds(302, 11, 89, 23);
contentPane.add(btnStart);
btnStop = new JButton("Stopp");
btnStop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//btnStart.setSelected(false);
var n = false;
panelAmpelOne.setGo(n);
panelAmpelTwo.setGo(n);
}
});
btnStop.setBounds(302, 45, 89, 23);
contentPane.add(btnStop);
btnEnde = new JButton("Ende");
btnEnde.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
btnEnde.setBounds(302, 79, 89, 23);
contentPane.add(btnEnde);
}
private void automatik()
{
System.out.println("Erfolgreicher Aufruf der Funktion!");
//Problem mit Konstruktor, Thread wird nicht erstellt:
t = new Thread(this);
t.start();
/*if(t.isAlive())
{
t.start();
}
else
{
System.out.println("t Wurde nicht erstellt");
}*/
//Problem mit Konstruktor, Thread wird nicht erstellt:
d = new Thread(this);
d.start();
/*if(d.isAlive())
{
d.start();
}
else
{
System.out.println("d Wurde nicht erstellt");
}*/
}
@Override
public synchronized void run() {
while(btnStart.isSelected())
{
try
{
/*btnStart.repaint();
btnStop.repaint();
btnEnde.repaint();*/
panelAmpelTwo.setRot();
Thread.sleep(rotPhase);
panelAmpelTwo.setRotgelb();
Thread.sleep(rotgelbPhase);
panelAmpelTwo.setGruen();
Thread.sleep(gruenPhase);
panelAmpelTwo.setGelb();
Thread.sleep(gelbPhase);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}