ERLEDIGT
JA
JA
ANTWORTEN
9
9
ZUGRIFFE
346
346
EMPFEHLEN
-
Hallo,
ich schreibe an einem Programm in welchem beim Drücken der Maus ein Thread gestartet werden soll, welcher einfach von 0 an hoch zählt und beim Loslassen der Maus, der Zähler einfach gestoppt werden soll.
Also der Thread sollte abhängig vom Zustand der Variablen (boolean) eine bestimmte Funktion ausführen.
Wenn sich der Zustand der Variablen ändert, während der Thread bereits läuft, führt der Thread aber nicht die andere gewünschte Funktion aus. Es scheint als ob der Thread, wenn er einmal läuft die Variable nicht mehr abfrägt.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
import java.awt.Canvas; import java.awt.Choice; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; public class AuswahlBox extends Canvas implements ItemListener, MouseListener, MouseMotionListener { public boolean gepresst = false; public AuswahlBox() { addMouseListener(this); } public Dimension getMinimumSize() { return new Dimension(300, 300); } public Dimension getPreferredSize() { return getMinimumSize(); } public void paint(Graphics g) { g.setColor(Color.black); g.fillRect(0, 0, 300, 300); } @Override public void itemStateChanged(ItemEvent e) { if(e.getItem() == "yellow") { System.out.println("yellow wurde gewählt"); } if(e.getItem() == "red") { System.out.println("red wurde gewählt"); } if(e.getItem() == "green") { System.out.println("green wurde gewählt"); } if(e.getItem() == "blue") { System.out.println("blue wurde gewählt"); } } public synchronized boolean pressed() { return gepresst; } @Override public void mouseDragged(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseMoved(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseClicked(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent arg0) { gepresst = true; System.out.println(gepresst); Thread meinThread = new Runner(); meinThread.start(); } @Override public void mouseReleased(MouseEvent arg0) { gepresst = false; System.out.println(gepresst); } }
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
public class Runner extends Thread { AuswahlBox box = new AuswahlBox(); public boolean pressed() { return box.pressed(); } @Override public void run() { int i = 0; System.out.println("gespresst: "+pressed()); while(true) { if(pressed()) { System.out.println(i); i++; } } } }
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
mport java.awt.BorderLayout; import java.awt.Choice; import java.awt.Frame; import java.awt.Panel; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JPanel; public class Main extends Frame{ public Main() { super("PaintCanvas"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent event) { setVisible(false); dispose(); System.exit(0); } }); } public static void main(String[] args) { Main main = new Main(); main.setLayout(new BorderLayout()); main.setSize(300, 300); Panel panel = new Panel(); AuswahlBox auswahlBox = new AuswahlBox(); panel.add(auswahlBox); main.add(panel, BorderLayout.CENTER); Choice choice = new Choice(); choice.addItemListener(auswahlBox); choice.addItem("yellow"); choice.addItem("red"); choice.addItem("green"); choice.addItem("blue"); Panel panel1 = new Panel(); panel1.add(choice); main.add(panel1, BorderLayout.SOUTH); main.setVisible(true); } }
Wie könnte ich das Programm abändern, damit der Thread auch während der läuft die Variable abfrägt.
-
Hi
das kann so nicht gehen, weil du bei jedem Mausklick einen neuen Thread erstellst.
Und noch dazu bekommt jeder Thread seine eigene Auswahlbox.
Starte den Thread nicht im mousePressed, sondern irgendwo am Anfang des Programms (zB Im Konstruktor von der Auswahlbox) und setz die box-Variable vom Thread (zwischen "new Runner" und "...start()") auf die vorhandene Auswahlbox.
Gruß
-
Danke für die schnelle Hilfe.
Hab das Programm jetzt so abgeändert:
Code :1 2 3 4 5 6 7 8 9 10
public class AuswahlBox extends Canvas implements ItemListener, MouseListener, MouseMotionListener { public boolean gepresst; public AuswahlBox() { addMouseListener(this); Thread meinThread = new Runner(); gepresst = false; meinThread.start(); }
Leider bekomme ich jetzt die Fehlermeldung:
Exception in thread "main" java.lang.StackOverflowError
at java.security.AccessControlContext.optimize(Unknown Source)
at java.security.AccessController.getContext(Unknown Source)
at java.lang.Thread.init(Unknown Source)
at java.lang.Thread.<init>(Unknown Source)
at Zeichenfeld.Runner.<init>(Runner.java:3)
at Zeichenfeld.AuswahlBox.<init>(AuswahlBox.java:20)
at Zeichenfeld.Runner.<init>(Runner.java:5)
at Zeichenfeld.AuswahlBox.<init>(AuswahlBox.java:20)
at Zeichenfeld.Runner.<init>(Runner.java:5)
at Zeichenfeld.AuswahlBox.<init>(AuswahlBox.java:20)
at Zeichenfeld.Runner.<init>(Runner.java:5)
at Zeichenfeld.AuswahlBox.<init>(AuswahlBox.java:20)
......
-
Du erstellst noch immer pro Thread eine Auswahlbox. Diese erstellt wieder einen Thread usw...
deshalb die Ex.
Zu tun:
1) Aus mousePressed den Threadstart rausnehmen. Ist ja schon im Konstruktor.
Nur gepresst=true und das System.out
2) Im Thread bei der box-Variable das =new... wegnehmen.
3) Dafür eine setBox-Methode (oder so ähnlich) machen.
4) Im Konstruktor der Auswahlbox vor meinThread.start() diese setBox-Methode mit this aufrufen.
-
Denn Threadstart hatte ich bereits aus mousePressed entfernt (hab vergessen es zu erwähnen).
Das "= new..." habe ich jetzt entfernt.
Das mit der setBox-Methode ist mir noch nicht so klar. Sorry bin doch noch mehr ein Anfänger.
In dieser setBox-Methode sollte doch eine AuswahlBox erzeugt werden, wenn ich aber dann diese Methode in den Konstruktor von AuswahlBox vor meinThread.start() einfüge, erhalte ich wieder einen StackOverflowError. Wahrscheinlich mache ich irgendetwas falsch
-
Du denkst falsch.
Warum soll der Thread seine eigene Auswahlbox erhalten?
Eine gibt es ja schon, die angezeigt wird.
Und genau die soll der Thread bekommen.
Du machst aber eine zweite im Thread, die zwar nicht sichtbar ist,
aber ihre eigene gepresst-Variable hat.
Die Stackoverflow-Sache kommt dadurch zusammen, dass
die Auswahlbox gleich beim Starten eine Thread erzeugt, dieser
sofort eine neue Auswahlbox, die wieder einen Thread ... und so weiter,
bis der dafür vorgesehene Speicher voll ist.
Zeig bitte noch einmal den ganzen Code, was du bis jetzt geändert hast
-
anbei den kompletten Code, ohne die setBox-Methode.
Bei meinem jetzigen Code bekomme ich die Fehlermeldung:
Exception in thread "Thread-2" java.lang.NullPointerException
at Zeichenfeld.Runner.pressed(Runner.java:9)
at Zeichenfeld.Runner.run(Runner.java:15)
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
import java.awt.Canvas; import java.awt.Choice; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; public class AuswahlBox extends Canvas implements ItemListener, MouseListener, MouseMotionListener { public boolean gepresst; public AuswahlBox() { addMouseListener(this); Thread meinThread = new Runner(); gepresst = false; meinThread.start(); } public Dimension getMinimumSize() { return new Dimension(300, 300); } public Dimension getPreferredSize() { return getMinimumSize(); } public void paint(Graphics g) { g.setColor(Color.black); g.fillRect(0, 0, 300, 300); } @Override public void itemStateChanged(ItemEvent e) { if(e.getItem() == "yellow") { System.out.println("yellow wurde gewählt"); } if(e.getItem() == "red") { System.out.println("red wurde gewählt"); } if(e.getItem() == "green") { System.out.println("green wurde gewählt"); } if(e.getItem() == "blue") { System.out.println("blue wurde gewählt"); } } public synchronized boolean pressed() { return gepresst; } @Override public void mouseDragged(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseMoved(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseClicked(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent arg0) { gepresst = true; System.out.println(gepresst); } @Override public void mouseReleased(MouseEvent arg0) { gepresst = false; System.out.println(gepresst); } }
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
public class Runner extends Thread { AuswahlBox box; public boolean pressed() { return box.pressed(); } @Override public void run() { int i = 0; System.out.println("gespresst: "+pressed()); while(true) { if(pressed()) { System.out.println(i); i++; } } } }
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
import java.awt.BorderLayout; import java.awt.Choice; import java.awt.Frame; import java.awt.Panel; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JPanel; public class Main extends Frame{ public Main() { super("PaintCanvas"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent event) { setVisible(false); dispose(); System.exit(0); } }); } public static void main(String[] args) { Main main = new Main(); main.setLayout(new BorderLayout()); main.setSize(300, 300); Panel panel = new Panel(); AuswahlBox auswahlBox = new AuswahlBox(); panel.add(auswahlBox); main.add(panel, BorderLayout.CENTER); Choice choice = new Choice(); choice.addItemListener(auswahlBox); choice.addItem("yellow"); choice.addItem("red"); choice.addItem("green"); choice.addItem("blue"); Panel panel1 = new Panel(); panel1.add(choice); main.add(panel1, BorderLayout.SOUTH); main.setVisible(true); } }
-
Jetzt machst du im Thread noch einen Setter für box
und beim AuswahlBox-Konstruktor kommt eine Zeile dazu:Code java:1 2 3
public void setBox(AuswahlBox x) { box = x; }
Code java:1 2 3 4 5 6 7 8
public AuswahlBox() { addMouseListener(this); Thread meinThread = new Runner(); gepresst = false; meinThread.setBox(this); //neu meinThread.start(); }
Was ist an einem Setter für box so schwer?
Alternativ übergibst du die Box gleich im Konstruktor, oder machst sie public und weist es einfach zu, oder ...
-
Vielen Dank
jetzt läuft es so wie es sollte
Was an dem Setter so schwer ist, kann ich im Moment auch nicht sagen.
-
30.06.11 19:54 #10SE Tutorials.de Gastzugang
Wenn dein Problem nun gelöst ist makiere den Thread bitte als Erledigt.
Ähnliche Themen
-
Video während Photoshop läuft
Von Lunam im Forum Videoschnitt, Videotechnik & -produktionAntworten: 1Letzter Beitrag: 08.06.10, 13:05 -
PC Schutz während VLC läuft
Von ZodiacXP im Forum Microsoft WindowsAntworten: 7Letzter Beitrag: 05.02.09, 15:26 -
Button drücken während Programm läuft
Von H2SO4 im Forum Visual Basic 6.0Antworten: 8Letzter Beitrag: 14.06.07, 11:15 -
variablen erstellen während die *.exe läuft
Von flashscorpion im Forum Visual Basic 6.0Antworten: 4Letzter Beitrag: 15.09.04, 17:52 -
Musik abspielen während das Programm läuft
Von The-God im Forum C/C++Antworten: 9Letzter Beitrag: 24.05.04, 09:18





Zitieren

Login





