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.
Wie könnte ich das Programm abändern, damit der Thread auch während der läuft die Variable abfrägt.
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:
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:
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:
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.