robot class

Viktormk

Mitglied
hallo leute,

eine Fragen, gibt es Abbruchbedinung bzw. button mit dem ich mein robot stoppen, pausieren lasse.

Habe nur Beenden JButton und ich bräcuhte eine Möglichkeit, wie ich mein Robot über GUI stoppe.

Danke !!!
 
Dann bau einen 'STOP' Button ein!

Wenn du Hilfe brauchst solltest du dein Problem schon detailiert beschreiben dann kann dir auch geholfen werden.
 
kurz und knapp

hier z.B.: mein Beenden-JButton und ich komme nicht drauf, wie ich desgleichen ein Stopbutton oder Pause-Button erstellen soll.

Sobal man den Roboter startet, hat man ja kein Zugriff aufs GUI !!!

Welche Möglichekeit gitbt es,, ich hoffe ich habe es ausführlich erklärt.

Java:
// Beenden
    jButton2.setBounds(225,500, 130, 25);
    jButton2.setText("Beenden");
    jButton2.setMargin(new Insets(2, 2, 2, 2));
    jButton2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        
        JOptionPane.showMessageDialog(panel, "Wollen Sie wircklich das Programm beenden ?",
        "Beenden", JOptionPane.INFORMATION_MESSAGE);
        jButton2_ActionPerformed(evt);
      }
    });
    cp.add(jButton3);
 
na dann sollte man den Robot evtl. nicht im EDT, sondern in einem seperaten Thread laufen lassen, so dass man die GUI noch bedienen kann...
 
nochmal,

habe versucht mit Class SwingWorker zu starten,

bekomme das einfach nicht hin

kann mir jemand weiterhelfen !!! ein Beispiel mit robot vielleicht,,, danke
 
poste doch deine Beispiele oder irgendwelche Informationen,
was ist überhaupt ein 'robot', doch sicher zum Interaktion mit anderen Programmen, aber inwiefern ist der zu starten und dauert länger?
wenn es einfach nur eine Schleife mit beliebigen Inhalt X ist, was sollte ein Beispiel damit von beliebigen anderen Beispielen unterscheiden?

SwingWorker Tutorial
kopiere deinen Code nach doInBackground()
 
ich verstehe schon,

ich habe robot class mit zwei Schleifen,,,

habe zwei jbuttons mit Starten und Beenden und möchte das es wie in dem Tutorial funktioniert.

muss ich die Funktion von dem "robot" doInBackground()
Java:
"doInBackground()
reinschreiben?

mein Beenden jbButton
Java:
jButton2.setBounds(0,220, 130, 25);
    jButton2.setText("Beenden");
    jButton2.setMargin(new Insets(2, 2, 2, 2));
    jButton2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        
      }
    });
    cp.add(jButton3);
 
@Viktormk
vorerst geht es doch wohl nur darum, überhaupt mit SwingWorker irgendwas zu starten,
über einen 'Beenden'-Button musst du noch nicht nachdenken...

ich sehe in deinem Posting nur eine Wiederholung meiner Aussage 'in doInBackground() rein',
da erübrigt sich wohl jeder weitere direkte Kommentar


ein eigentlich offensichtlicher handwerklicher Hinweis erscheint mir nun angebracht:
der erste Schritt zum Einsatz eines SwingWorkers ist Einbau dieses SwingWorkers in deinen Code..,
du musst das was im Beispiel zwischen "// Construct a new SwingWorker" und
"// Execute the SwingWorker; the GUI will not freeze" + die Zeile dahinter herrüberkopieren!,
bei dir in den Start-Button oder so..

edit: ein normaler Thread geht in der Tat auch
 
habe es so versucht
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutionException;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.SwingWorker;
import java.awt.AWTException;
import java.awt.Robot;



public class Demo1WithSwingWorker extends JFrame implements ActionListener{
  
  
  JButton jbutt_start;
  SwingWorker<String, Void> worker;
  String theresult;
  
  
  /**
  * Init the GUI elements
  */
  public void initComponents(){
    
    jbutt_start = new JButton("Starten");
    jbutt_start.addActionListener(this);
    jbutt_start.setActionCommand("Starten");
    
    getContentPane().setLayout(new GridLayout(1,4));
    
    
    getContentPane().add(jbutt_start);
    
    
    pack();
    setSize(400,60);
    setVisible(true);
  }
  
  
  public void actionPerformed(ActionEvent evt){
    String cmd = evt.getActionCommand();
    if(cmd.equalsIgnoreCase("Starten")){  // Start button gedrückt
      
      worker = new SwingWorker<String, Void>(){
        
        @Override
        protected String doInBackground(){
          return doRobot();
        }
        
        @Override
        protected void done(){
          try {
            
          } catch (InterruptedException e) {
            e.printStackTrace();
          } catch (ExecutionException e) {
            e.printStackTrace();
          }
          
        }
      };
      
      
      
      worker.execute();
    }
    
    
  }
  
  public static void main(String[] args) {
    new robot("robot");
    
  }
  
  
  
  
  
  public String doRobot (){
    
    Robot rob = null;
    try
    {
      
      
      
      rob = new Robot ();
      
      
    }
    catch (AWTException e)
    
    {
      // TODO Auto-generated catch block
      e.printStackTrace ();
    }
    
    
    
    rob.delay(2500); //  warte 2.5 Sekunden
    
    rob.mouseMove(297,161); // Mauszeiger bewegen
    rob.delay(1500); //  warte 1.5 Sekunden
    rob.mousePress(InputEvent.BUTTON1_MASK); // linke Maustatse drücken
    rob.mouseRelease(InputEvent.BUTTON1_MASK); // und wieder loslassen
    
    
    rob.delay(1500); //  warte 1.5 Sekunden
    
    
    
    
    
    
    
    
  }
  }
 
besteht dazu ein Problem oder bist du dann wieder bei der Ursprungsfrage?

andere Buttons wie 'Stop' sollten doch nun zumindest wieder bedienbar sein,
fragt sich nur was die dann machen sollen..

interrupt() für SwingWorker würde anscheinend das delay() von Robot abbrechen,
aber danach geht es weiter einen Befehl nach den anderen,

wie auch in normalen Threads muss man ständig, ob Abbruch sein sollte,
Canceling Background Tasks (The Java™ Tutorials > Creating a GUI With JFC/Swing > Concurrency in Swing)

aller Wahrscheinlichkeit passiert das vor allem in den Wartepausen,
statt delay() oder Thread.sleep() könnte man eine eigene Methode bauen, die intern auch eines der anderen beiden nutzt,
danach und gleich noch davor aber schaut ob Abbruch sein soll, dann wird mit wenig Aufwand ziemlich oft geprüft,

fragt sich wiederum, was denn im Abbruchfall passieren soll.., eine Exception werfen könnte unschön sein,
eine boolean-Rückgabe könnte zusammen mit aufwendigeren delays gehen:
Java:
    rob.mouseMove(297,161); // Mauszeiger bewegen
    if (checkDelay(1500)) return; //  warte 1.5 Sekunden (oder Abbruch)

----

einen eigenen Thread kann man ultimativ mit stop() wohl wirklich killen, aber auch nicht schön..


eine perfekte, eine 'schöne' Lösung habe ich dazu nicht, schreibe nur weil eh gerade hier dabei 😉
 

Zurück
Oben