Robot ist zum drücken der Taste da, nicht zum auslesen ob der Benutzer die Taste drückt..
Wenn du new GUI hast: Häng nen KeyListener an den Component dran, das den Focus hat. Oder benutz die Input/ActionMap
Ansonsten: Imho kann man mit Java keine "KeyEvents" bekommen, wenn der Benutzer nicht die GUI von einem benutzt, ich würd mich aber sehr gerne eines besseren belehren lassen...
Beschreib mal ungefähr Dein Programm. Was soll es denn insgesamt tun? Und wozu benötigst Du in diesem Kontext die Tastaturabfrage? Dann kann man besser auf das Problem eingehen.
also ich versuche erstmal eine klasse zu machen die nach meinen vorstellungen funktioniert. da ich die while schleife brauche das er ja alle 9,5 sekunden klickt, sie aber nicht allein aufhört, dachte ich mir, ich frage eine taste ab, und halte das ganze mit break; an.
ich will das ganze später über einen button laufen lassen.
Code:
import java.awt.*;
import java.awt.event.*;
public class eklick {
public static void main(String[] args) throws AWTException {
while (true)
{
try {
Thread.sleep(9500);
Robot erz = new Robot();
erz.mouseMove(100,524);
erz.mousePress(InputEvent.BUTTON1_MASK);
erz.mouseRelease(InputEvent.BUTTON1_MASK);
System.out.println("erz hacken");
} catch (InterruptedException e) {
// nix fangen sondern fortfahren
}
}
}
}
und endgültig soll es hier rein:
Code:
public class erz implements ActionListener {
public void actionPerformed(ActionEvent ev) {
System.out.println("erz wurde angeklickt");
}
}
da ich die while schleife brauche das er ja alle 9,5 sekunden klickt, sie aber nicht allein aufhört, dachte ich mir, ich frage eine taste ab, und halte das ganze mit break; an.
Um einen Tastendruck mitzubekommen brauchst Du eine Komponente mit Fokus. Ansonsten bekommst Du nichts mit. Dieser Ansatz wird also nicht einfach so funktionieren. Im Allgemeinen wäre es doch ohnehin schöner, die über einen Button gestartete Aktion auch wieder über den Button stoppen zu können.
In dem Fall musst Du die Aktion in einem separaten Thread ausführen. So lange die Methode des ActionListener nicht zurückkehrt kann nämlich in der ganzen Anwendung auch nichts mehr gezeichnet und keine Eingaben mehr verarbeitet werden. Das sieht dann sehr hässlich aus. Und ein Stop-Button würde auch gar nicht mehr funktionieren können, weil der Thread der die Eingaben (Mausklick auf den Button) verarbeiten müsste mit Deiner Schleife beschäftigt ist.
Die Schleife würde ich -- wie Du auch schon angenommen hast -- um eine Abbruchbedingung erweitern:
Java:
while(!stopped){// Hier der Inhalt Deiner Schleife, ohne Änderung}
Die Schleife solltest Du in eine eigene Klasse auslagern. Die Klasse muss das Runnable-Interface implementieren, damit Instanzen der Klasse in einem separaten Thread ausgeführt werden können. Die Variable stopped sollte eine Member-Variable der Klasse sein. Eine stop()-Methode sollte die Variable auf true setzen und den ausführenden Thread unterbrechen, damit die Schleife zum Abbruch kommt. So in etwa:
Java:
publicclassClickerimplementsRunnable{privateboolean stopped;privateThread workerThread;@Overridepublicvoidrun(){
workerThread =Thread.currentThread();while(!stopped){// Hier der Inhalt Deiner Schleife, ohne Änderung}}/** Stop the clicking. */publicvoidstop(){
stopped =true;if(workerThread !=null){
workerThread.interrupt();}}}
Die actionPerformed-Methode der Klasse Erz (Variablennamen immer mit Großbuchstaben anfangen lassen (CamelCase); das macht man in Java so) soll nun einen Clicker erzeugen und in einem Thread starten. Wenn schon ein Clicker läuft soll sie den Clicker anhalten und keinen neuen erzeugen.
Da der Button-Text sich am besten ändern soll, würde ich die Klasse Erz dann lieber das Action-Interface implementieren lassen. Das ist eine Erweiterung der ActionListener und bietet gleich den Text, ein Icon, einen ToolTip (...) mit an:
Nun muss man dem Button keinen Text mehr geben, den holt er sich gleich von der Action. Actions setzt man nicht mit addActionListener(...), sondern so:
Ich hoffe, das war verständlich erklärt und hilft Dir weiter. Falls ich ein paar kleine Fehler im Quelltext habe: Der Quelltext ist im Browser getippt. Am besten selber korrigieren oder nachfragen.
Erstmal vielen Dank für diese ausführliche Beschreibung.
Die Idee mit den Button finde ich persönlich sehr gut. Ich wusste zwar das man das alles umbrnennen kann aber dieses dann auch noch am selben Button zu stoppen ist mir nicht in den Kopf gekommen.
Ok, nun habe ich das alles fein eingefügt, meinen Code um einige Zeilen leichter gemacht, dank den oben erwähnten Beispielen und wollte ihn Compilieren. Als Fehlermeldung kam nun das er throws AWTException für new Robot braucht.
Ich habe mir auch einige Beispiele angesehen, konnte aber mit diesen leider nix anfangen.
Ich habe versucht Robot nun in eine neue Klasse zu machen, brachte leider keinen Erfolg. Ich habe auch versucht in x Möglichkeiten throws AWTException vor und hinter run einzufügen, braucht leider auch keinen Erfolg.
Irgendwie versteh ich es nicht, kann mir bitte noch jemand einen Tip geben? Ich habe es nun so in verschiedenen Ausführungen versucht, mit try, catch und finally, nur mit try und catch, aber ich bekomme es nicht hin.
Mein Aktueller stand:
Code:
public class Clicker implements Runnable {
private boolean stopped;
private Thread workerThread;
@Override
public void run() {
workerThread = Thread.currentThread();
while (!stopped) {
Robot erz = null;
try {
erz = new Robot();
catch (AWTException e) {
e.printStackTrace();
}
erz.mouseMove(100,524);
erz.mousePress(InputEvent.BUTTON1_MASK);
erz.mouseRelease(InputEvent.BUTTON1_MASK);
erz.delay(9500);
System.out.println("erz hacken");
}
}