Hi Leute,
Ich programmiere gerade so eine Art Stoppuhr.
dazu benutze ich zwei Klassen:
1. GraphOber
Diese ist eine mit Swing programmierte Oberfläche, welche unter anderem zwei Eingabefelder und einen JButton enthält. In diese kann man etwas eintragen (zB: wasauchimmer | 12:34), anschließend kann man mit einem klicken auf den Button einen Thread (2.Klasse) starten.
Der Thread erstellt dann ein JPanel, in dem die restliche Zeit angezeigt wird.
2.Zaehler
Dieser zaehlt dann die im zweiten eingegebene Zeit runter und zeigt anschließend ENDE an.
Das Problem ist:
Sobald ich einen zweiten Thread starte, übernimmt der erste Thread die Zeit vom zweiten und beide Threads zählen ab dann gemeinsam runter.
Ich verstehe das nicht so richtig. Eigentlich erzeuge ich doch jedesmal einen neuen Thread (GraphOber Zeile 40). Warum also überlappen die sich? Und wie vermeidet man so etwas?
Schon mal im voraus danke.
Ich programmiere gerade so eine Art Stoppuhr.
dazu benutze ich zwei Klassen:
1. GraphOber
Diese ist eine mit Swing programmierte Oberfläche, welche unter anderem zwei Eingabefelder und einen JButton enthält. In diese kann man etwas eintragen (zB: wasauchimmer | 12:34), anschließend kann man mit einem klicken auf den Button einen Thread (2.Klasse) starten.
Der Thread erstellt dann ein JPanel, in dem die restliche Zeit angezeigt wird.
2.Zaehler
Dieser zaehlt dann die im zweiten eingegebene Zeit runter und zeigt anschließend ENDE an.
Das Problem ist:
Sobald ich einen zweiten Thread starte, übernimmt der erste Thread die Zeit vom zweiten und beide Threads zählen ab dann gemeinsam runter.
Ich verstehe das nicht so richtig. Eigentlich erzeuge ich doch jedesmal einen neuen Thread (GraphOber Zeile 40). Warum also überlappen die sich? Und wie vermeidet man so etwas?
Schon mal im voraus danke.
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.* ;
import java.util.StringTokenizer;
import java.util.Scanner;
class Zaehler extends Thread{
static String eingabe;
static int dauer_ms; //dauer in Millisekunden
static int minuten;
static int sekunden; //Dauer in Sekunden
static int dauer_s;
static double prozent;
JPanel zeile = new JPanel();
JLabel titel;
JLabel restzeit;
public Zaehler (String a, String b){
setName(a);
eingabe = b;
titel = new JLabel( a + ": " ); //JLabel mit dem Namen des Threads
StringTokenizer st = new StringTokenizer(eingabe, ":");
minuten = Integer.parseInt(st.nextToken());
sekunden = Integer.parseInt(st.nextToken());
dauer_ms = 60000*minuten + 1000*sekunden;
dauer_s = (int) dauer_ms / 1000;
restzeit = new JLabel();
restzeit.setText("Restzeit: " + minuten +":" + sekunden);
zeile.add(titel);
zeile.add(restzeit);
start();
}
public void run(){
int merker = 0;
prozent = dauer_s / 100.0;
while ( minuten != -1 ){
++merker;
try{
sleep( 1000 );
}catch(Exception e){
System.out.println("ERROR");
}
sekunden -= 1;
if (sekunden == -1){
sekunden = 59;
minuten -= 1;
}
restzeit.setText( "Restzeit: " + minuten +":" + sekunden);
}
restzeit.setText( "ENDE");
}
}
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.* ;
class GraphOber extends JFrame implements ActionListener{
JLabel eingabe = new JLabel("Eingabe: ");
JLabel eingabe2 = new JLabel("Zeit: ");
JTextField tFeld1 = new JTextField( 7 );
JTextField tFeld2 = new JTextField( 7 );
JButton starten = new JButton ("Start!");
public GraphOber( String title ){
super( title );
setLayout( new FlowLayout() );
JPanel ersteZeile = new JPanel();
starten.addActionListener( this );
ersteZeile.add( eingabe );
ersteZeile.add( tFeld1 );
ersteZeile.add( eingabe2 );
ersteZeile.add( tFeld2 );
ersteZeile.add( starten);
add(ersteZeile);
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
public void actionPerformed( ActionEvent evt){
String eingabe1 = tFeld1.getText() ;
String eingabe2 = tFeld2.getText() ;
Zaehler poi = new Zaehler(eingabe1, eingabe2); //neuer Zaehler
add(poi.zeile);
repaint();
}
public static void main ( String[] args ){
GraphOber lol = new GraphOber ("LOL");
lol.setSize( 400, 300 );
lol.setVisible( true );
}
}