Mausklicks innerhalb eines JFrames/SWTBrowser ohne richtige Maus simulieren

Shevrar

Mitglied
In dem BrowserExample von SWT soll mein Programm eigenständig auf bestimmte Bereiche innerhalb des Browsers klicken,
ich weiß mit der Klasse Robot wäre dies möglich einfach die Maus an Position x y zu bewegen und dann ein Klick zu erzeugen,
aber mein Problem ist das die "richtige" Maus nicht verwendet werden soll (der Benutzer soll weiterhin damit irgendwas anderes machen können).
Das heißt im Prinzip soll das Programm eine eigene Maus haben die auch wenn das Fenster minimiert ist immer noch seine Klicks ausführt innerhalb des Fensters

ich hoffe ihr habt meine Problematik verstanden, was ich meine 😀


hier nochmal der Code vom BrowserExample von SWT
Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
 
public class SWTBrowserExample {
    
    private Shell shell = null;
    private Browser browser = null;
    
    private static final String url = "www.Youtube.de";
    private static final String title = "SWTBrowserExample";
    
    public static void main(String[] args) {
        Display display = new Display();
        SWTBrowserExample browser = new SWTBrowserExample();
        browser.createBrowser();
        browser.shell.open();
        
        while (!browser.shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }           
        }
        display.dispose();
    }
    
    private void createBrowser() {      
        shell = new Shell();
        shell.setLayout(new FillLayout());
        shell.setSize(new Point(800, 800));
        shell.setLocation(new Point(100, 100));
        shell.setText(title);
        
        browser = new Browser(shell, SWT.BORDER);
        browser.setUrl(url);
    }
    
}
 
Programmiere deine Applikation für die normale Maus. Indem du die "dispatch"-Methoden von deinem Fenster nutzt, kannst du beliebige MouseEvents verschicken. So würde man in AWT simulieren, dass die linke Maustaste an einer beliebigen Stelle gedrückt wird:

Java:
Component component = window.findComponentAt((int) getX(), (int) getY());
window.dispatchEvent(new MouseEvent(component, MouseEvent.MOUSE_PRESSED, System
	.currentTimeMillis(), MouseEvent.BUTTON1_DOWN_MASK, (int) getX(),
	(int) getY(), 0, false, MouseEvent.BUTTON1));
 
Danke für die Antwort trotzdem hab ich jezt noch ein Problem.

Ich hab mittlerweile meinen SWT Browser in ein JFrame eingefügt.
somit müsste doch dein "window" mein JFrame sein oder ?
nun sagt aber wenn ich window durch mein JFrame ersetze, Eclipse das es folgendes wenn ich auf
das rot unterstrichene dispatchEvent gehe : "The method dispatchEvent(AWTEvent) in the type Component is not applicable for the arguments (MouseEvent)"

Anbei nochmal mein aktueller code

Java:
import java.awt.AWTException;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Component;
import java.awt.Robot;
import javax.swing.JFrame;
import javax.swing.JScrollPane;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseWheelListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;

public class BrowserSwingPanel implements Runnable{
	Browser browser;
	JFrame f;
	 Robot r;
	 Display display;
	  Shell shell ;
	 
   public static void main(String args[]) {
	   BrowserSwingPanel bp;
	   bp=new BrowserSwingPanel();	  
	   bp.starte();
   }
   
   void starte (){
	      f = new JFrame();
	      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	      f.setUndecorated(true);
	      Canvas canvas = new Canvas();
	      f.setSize(1070, 810);	     
	      f.add(canvas);
	      f.setVisible(true);
	      display = new Display();
	      shell = SWT_AWT.new_Shell(display, canvas);
	      shell.setSize(1070, 810);
	      browser = new Browser(shell, SWT.NO_SCROLL);
	      browser.setSize(1070, 810);
	      browser.setUrl("www.Youtube.de");     
	      shell.open();
	      
	     
	      try {
			r=new Robot();
		} catch (AWTException e) {			
			e.printStackTrace();
		}
	      
	    
	     Thread t;
	     t=new Thread(this);
	     t.start();
	     
	  
	     while (!shell.isDisposed()) {	
	         if (!display.readAndDispatch())
	            display.sleep(); 
	      } display.dispose();
	      f.dispose();
	     
	   
   }
   
  
   
public void run() {
	
	
	
	
    Component component = f.findComponentAt((int) f.getX(), (int) f.getY());
    f.dispatchEvent(new MouseEvent(component, MouseEvent.MOUSE_PRESSED, System
        .currentTimeMillis(), MouseEvent.BUTTON1_DOWN_MASK, (int) f.getX(),
        (int) f.getY(), 0, false, MouseEvent.BUTTON1));
	
 
       
}
   
  
}
 
Das liegt daran, dass du den MouseEvent von SWT importiert hast und nicht vom AWT-Package. Für gewöhnlich ist es auch eher unüblich AWT, Swing und SWT zu mischen. Wenn du einen SWT Browser hast, dann solltest du deine Applikation komplett in SWT entwickeln.
 
Wenn ich mein JFrame zb. mit nem JButton bestücke funktioniert es, aber bei Websiten die ich mit dem SWTBrowser anzeige wie z.B Youtube Funktioniert dies leider nicht :-(
 
Wie ich bereits gesagt habe, wird das auch nicht funktionieren. Schau dir die SWT-API an. Dort gibt es auch ein MouseEvent. Das musst du benutzten, um mit deinem SWT-Browser kommunizieren zu können. Das in AWT war lediglich ein Beispiel.

PS: Das ist unter anderem ein guter Grund AWT und SWT nicht zu mischen.
 
Gibt es den auch in AWT eine möglichkeit einfach einen Browser darzustellen , so wie bei SWT ? oder
wie müsste ich das den bei SWT mit dem Mouseevent machen hab bis jezt erst diese Methode
für swt gefunden aber da bewegt muss ich dann auch wieder vorher meine Maus dorthin bewegen.


Java:
  event.type = SWT.MouseDown;
       event.button = 1;
       display.post(event);
 

Zurück
Oben