Hi,
habe hier ne etwas spezielle Aufgabe und komm nicht weiter... Das Endprodukt soll so aussehen:
Dabei soll folgende Klassenstruktur verwendet werden:
Das Programm erwartet zunächst drei Parameter und wandelt diese in int um, diese werden den Threads
als Verzögerung übergeben Thread.sleep(delay);... Die drei Threads zählen dann mit dem jeweiligen delay
von 0 auf 100 hoch und geben einen Meldung aus wenn Sie 100 erreicht haben, zusätzlich wird mit ange-
zigt wie oft welcher Thread die 100 erreicht hat... soweit läuft das schon mal auf der Konsole
Nun soll das ganze noch in einem Swingfenster (img1) unter Berücksichtigung der obigen Klassenstruktur
(img2) dargestellt werden.
Und genau da verliessen Sie ihn... anbei mein unfertiger und leider fehlerhafter Lösungsansatz ???:L
ThreadInfoPanel, ThreadProgressPanel u. ButtonPanel sollen hier im Sinne der OO nur jeweils ein
Exemplar bereitstellen und dementsprechend im Swingfenster angezeigt werden. Wobei noch ein
img (img1 - grünes Quadrat) anzeigen soll wann welcher Thread aktiv ist... über den Beenden Button
soll das Fenster geschlossen werden.
Über "Threads abbrechen" soll in TeilB der Aufgabe die Threads in einer ThreadGroup angelegt und
über einen ActionListener gestoppt werden.
Der Aufruf der Threads soll über eine Schleife im Konstruktor von MyFrame erfolgen. Den Threads
werden dann der Name, die Verzoegerungszeit, die beiden zugehoerigen JPanels als Parameter
übergeben. Die Threads rufen dann die Methoden der JPanels auf, um selbststaendig die Informationen
über ihren Status zu aktualisieren.
for (int i=0; i<3; i++)
{
threadArray = new Thread(new MyThread("Thread " + (i + 1), delay,
infoPanel, progressPanel));
threadArray.start();
}
**** Hier steck ich schonmal fest und bekomm folgende Fehlermeldung:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at MyFrame.<init>(MyFrame.java:54)
at Aufgabe4.<init>(Aufgabe4.java:78)
at Aufgabe4.main(Aufgabe4.java:58)
Bin dankbar für jeden Hinweis
Grüße
habe hier ne etwas spezielle Aufgabe und komm nicht weiter... Das Endprodukt soll so aussehen:
Dabei soll folgende Klassenstruktur verwendet werden:
Das Programm erwartet zunächst drei Parameter und wandelt diese in int um, diese werden den Threads
als Verzögerung übergeben Thread.sleep(delay);... Die drei Threads zählen dann mit dem jeweiligen delay
von 0 auf 100 hoch und geben einen Meldung aus wenn Sie 100 erreicht haben, zusätzlich wird mit ange-
zigt wie oft welcher Thread die 100 erreicht hat... soweit läuft das schon mal auf der Konsole
Nun soll das ganze noch in einem Swingfenster (img1) unter Berücksichtigung der obigen Klassenstruktur
(img2) dargestellt werden.
Und genau da verliessen Sie ihn... anbei mein unfertiger und leider fehlerhafter Lösungsansatz ???:L
ThreadInfoPanel, ThreadProgressPanel u. ButtonPanel sollen hier im Sinne der OO nur jeweils ein
Exemplar bereitstellen und dementsprechend im Swingfenster angezeigt werden. Wobei noch ein
img (img1 - grünes Quadrat) anzeigen soll wann welcher Thread aktiv ist... über den Beenden Button
soll das Fenster geschlossen werden.
Über "Threads abbrechen" soll in TeilB der Aufgabe die Threads in einer ThreadGroup angelegt und
über einen ActionListener gestoppt werden.
Der Aufruf der Threads soll über eine Schleife im Konstruktor von MyFrame erfolgen. Den Threads
werden dann der Name, die Verzoegerungszeit, die beiden zugehoerigen JPanels als Parameter
übergeben. Die Threads rufen dann die Methoden der JPanels auf, um selbststaendig die Informationen
über ihren Status zu aktualisieren.
for (int i=0; i<3; i++)
{
threadArray = new Thread(new MyThread("Thread " + (i + 1), delay,
infoPanel, progressPanel));
threadArray.start();
}
**** Hier steck ich schonmal fest und bekomm folgende Fehlermeldung:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at MyFrame.<init>(MyFrame.java:54)
at Aufgabe4.<init>(Aufgabe4.java:78)
at Aufgabe4.main(Aufgabe4.java:58)
Bin dankbar für jeden Hinweis
Grüße
Code:
import java.awt.Container;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Aufgabe4 extends Object
{
/*
Erfuellt folgende Anforderungen:
- Pruefung, ob drei Befehlszeilen-Parameter eingegeben wurden
- Pruefung, ob drei ganze (Integer) Zahlen eingegeben wurden
Im Fehlerfall wird ein Dialogfeld mit entsprechender Nachricht
dargestellt und das Programm beendet
- Ausgabe der drei Zahlen in einem Dialogfeld
- Instanziierung und Starten der drei Threads
*/
public final static int WINSCORE = 100; // Highscore
private MyThread topThread, middleThread, bottomThread;
public static void main(String[] args)
{
int[] params = new int[3]; // Array fuer die drei int Parameter
// Pruefen, ob genau drei Parameter eingegeben wurden
if (args.length != 3)
{
String s = "Bitte geben Sie drei ganze Zahlen als Parameter an." +
"\nNach dem Drücken von OK wird das Programm beendet!";
JOptionPane.showMessageDialog(null, s, "Fehler!", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
// Pruefen, ob die drei Strings Integers sind
try
{
for (int i = 0; i < 3; i++)
{
params[i] = Integer.parseInt(args[i]);
}
}
catch (NumberFormatException e)
{
String s = "Mindestens einer der angegebenen Parameter ist keine ganze Zahl." +
"\nNach dem Drücken von OK wird das Programm beendet!";
JOptionPane.showMessageDialog(null, s, "Fehler!", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
// Alles in Ordnung -> Ausgabe der Parameter
String s = "Die eingegebenen Werte sind:\n" + params[0] + ", " + params[1] + " und " + params[2];
JOptionPane.showMessageDialog(null, s, "Information", JOptionPane.INFORMATION_MESSAGE);
// Aufrufen des Konstruktors zur Gernerierung der Threads
// Grund: in einer statischen Methode wie z.B. main kann man
// nur statische Objekte und Variablen verwenden.
new Aufgabe4(params);
//MyFrame frame = new MyFrame();
// frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
//frame.setVisible(true);
}
public Aufgabe4(int[] delay)
{
topThread = new MyThread("Top-Thread", delay[0], null, null);
new Thread(topThread).start();
middleThread = new MyThread("Middle-Thread", delay[1], null, null);
new Thread(middleThread).start();
bottomThread = new MyThread("Bottom-Thread", delay[2], null, null);
new Thread(bottomThread).start();
// Erstellung des Fensters zur Anzeige der Threads
MyFrame frame = new MyFrame(delay);
frame.setVisible(true);
}
}
Code:
import java.awt.BorderLayout;import javax.swing.*;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextArea;
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;
import javax.swing.JProgressBar;
public class MyFrame extends JFrame implements ActionListener
{
//private JButton exitButton;
public JLabel inIPanel;
private JProgressBar pbFortschritt;
private JButton btEnde;
private int MyThread;
public MyFrame(int[] delay){
setTitle("Threads");
setSize(800, 500);
//exitButton = new JButton("Beenden");
Container inhalt = getContentPane();
inhalt.setLayout(new GridLayout(7, 1));
//inhalt.add(exitButton, "South");
inhalt.add(new ThreadInfoPanel(inIPanel));
inhalt.add(new ThreadProgressPanel(pbFortschritt));
inhalt.add(new ThreadInfoPanel(inIPanel));
inhalt.add(new ThreadProgressPanel(pbFortschritt));
inhalt.add(new ThreadInfoPanel(inIPanel));
inhalt.add(new ThreadProgressPanel(pbFortschritt));
inhalt.add(new ButtonPanel(btEnde));
// btEnde.addActionListener(this);
//btEnde.addActionListener(this);
//exitButton.addActionListener(this);
// Error - java.lang.ArrayIndexOutOfBoundsException
Thread[] threadArray = new Thread[MyThread];
for (int i=0; i<3; i++)
{
threadArray[i] = new Thread(new MyThread("Thread " + (i + 1), delay[i], null, null));
/*
threadArray[i] = new Thread(new MyThread("Thread " + (i + 1), delay[i],
inIPanel[i], progressPanel[i]));
*/
threadArray[i].start();
}
}
// ActionEvent
public void actionPerformed(ActionEvent event){
// beendenButton Ereignis
Object source = event.getSource();
//if (source == exitButton) System.exit(0);
if (source == btEnde) System.exit(0);
}
}
Code:
import java.awt.Container;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MyThread extends Object implements Runnable
{
private String name;
private int delay;
private int points = 0; // Laeuft von 0 bis 100
static int wins = 0; // Zaehlt die einzelnen Laeufe bis 100
public MyThread(String inName, int inDelay, ThreadInfoPanel inIPanel, ThreadProgressPanel inPPanel)
{
this.name = inName;
this.delay = inDelay;
inIPanel = inIPanel;
inPPanel = inPPanel;
}
public void run()
{
try
{
for (;;) // absichtliche Endlosschleife :)
{
points ++;
final int j = points;
//pbFortschritt.setValue(points);
// pbFortschritt.setValue(i);
// Konstante in der Hauptklasse abfragen
if (points == Aufgabe4.WINSCORE)
{
wins ++;
// Ausgabe der Gewinne auf Kommandozeilenebene
String s = name + " mit " + delay + " ms Verzoegerung hat " + Aufgabe4.WINSCORE
+ " - " + wins + " Mal erreicht.";
System.out.println(s);
points = 0;
}
// Thread legt sich fuer seine Verzoegerungsdauer schlafen
Thread.sleep(delay);
}
}
catch (InterruptedException e) { return; }
}
}
Code:
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
class ThreadInfoPanel extends JPanel
{
// JLabel jlInfo gibt Info ueber: name, delay, points, WINSCORE
public ThreadInfoPanel(JLabel inIPanel)
{
inIPanel = new JLabel();
setLayout(new FlowLayout(FlowLayout.LEFT));
add(inIPanel);
}
}
Code:
import java.awt.FlowLayout;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JPanel;
class ThreadProgressPanel extends JPanel
{
// Enthaelt ProgressBar für topThread, middleThread, bottomThread
public ThreadProgressPanel(JProgressBar pbFortschritt)
{
pbFortschritt = new JProgressBar(0, 100);
pbFortschritt.setStringPainted(true);
setLayout(new FlowLayout(FlowLayout.CENTER));
add(pbFortschritt);
}
}
Code:
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
class ButtonPanel extends JPanel
{
// Enthaelt die Schaltflaeche "Beenden" in einem FlowLayout
public ButtonPanel(JButton btEnde)
{
btEnde = new JButton("Beenden");
setLayout(new FlowLayout(FlowLayout.RIGHT));
add(btEnde);
}
}