İçindekilerGirişİndex
YukarıİlkÖnceki YokSonrakiSon
Geriİleri
Yazdır
Raşit Fidan
fidanras79@yahoo.com

Java AWT Robot Kullanımı Örneği

Robot Nedir?

Robot class'ı kullanıcının yapacağı işleri yapan bir classtır.Yani sizin yerinize fareyi hareket ettirir,butonlarına basar.Ayrıca klavyeden tuşlara basar. Bu class çeşitli amaçlar için kullanılır.Yapılan bir programı test etmek,uzaktan kullanıcının olmadığı applikasyonlu programlarda kullanıcının yerine kullanılır.

Biz bu örneğimizde Robot classını kullanarak dinamik olarak çalışan "Help" yaptık,onu anlatacağım.Özetle kullanıcı kullanmaya başlayacağı yeni bir programı nasıl kullanması gerektiğini Robot kullanarak öğrenmesini sağlayacağız, göstereceğiz..

Servant class'ı

Servant.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 package jhelp;
  2 import java.awt.*;
  3 import java.awt.event.*;
  4 import javax.swing.*;
  5 public class Servant
  6     implements Runnable {
  7   private Robot servant;
  8   private Process process;
  9   private Point startPoint;
 10   private Holder holder;
 11   private Thread runner;
 12   private static int moveDelay = 5;
 13   private static int clickDelay = 150;
 14   private double mouseLocX, mouseLocY;
 15   private double distance;
 16   private static double ds = 2;
 17   private double dx, dy;
 18   public Servant() {
 19     try {
 20       servant = new Robot();
 21       holder = Holder.getDefaultHolder();
 22       runner = new Thread(this);
 23     }
 24     catch (AWTException ex) {
 25     }
 26   }
 27   public void doTask(Point startPoint, Process process) {
 28     this.process = process;
 29     this.startPoint = startPoint;
 30     runner.start();
 31   }
 32   public void moveMouse(Point start, Point end) {
 33     setMouseX(start.getX());
 34     setMouseY(start.getY());
 35     setDistance(end);
 36     setDeltaX(end);
 37     setDeltaY(end);
 38     while (getDistance() > ds) {
 39       servant.mouseMove( (int) Math.floor(getMouseX()),
 40                         (int) Math.floor(getMouseY()));
 41       servant.delay(moveDelay);
 42       setMouseX(getMouseX() + dx);
 43       setMouseY(getMouseY() + dy);
 44       setDistance(end);
 45       setDeltaX(end);
 46       setDeltaY(end);
 47       if (getDistance() <= ds) {
 48         setMouseX(end.getX());
 49         setMouseY(end.getY());
 50         servant.mouseMove( (int) end.getX(), (int) end.getY());
 51         servant.delay(moveDelay);
 52         break;
 53       }
 54     }
 55   }
 56   private void clickMouse(boolean click) {
 57     if(click){
 58       servant.mousePress(InputEvent.BUTTON1_MASK);
 59       servant.mouseRelease(InputEvent.BUTTON1_MASK);
 60       servant.delay(clickDelay);
 61     }
 62   }
 63   public void setMouseX(double mouseLocX) {
 64     this.mouseLocX = mouseLocX;
 65   }
 66   public void setMouseY(double mouseLocY) {
 67     this.mouseLocY = mouseLocY;
 68   }
 69   public double getMouseX() {
 70     return mouseLocX;
 71   }
 72   public double getMouseY() {
 73     return mouseLocY;
 74   }
 75   public void setDistance(Point end) {
 76     distance = Math.sqrt(Math.pow( (end.getX() - getMouseX()), 2) +
 77                          Math.pow( (end.getY() - getMouseY()), 2));
 78     //r^2=x^2+y^2;
 79   }
 80   public double getDistance() {
 81     return distance;
 82   }
 83   public void setDeltaX(Point end) {
 84     dx = ds * ( (end.getX() - getMouseX()) / getDistance());
 85   }
 86   public void setDeltaY(Point end) {
 87     dy = ds * ( (end.getY() - getMouseY()) / getDistance()); ;
 88   }
 89   public double getDeltaX() {
 90     return dx;
 91   }
 92   public double getDeltaY() {
 93     return dy;
 94   }
 95   public void run() {
 96     Object[] keys=process.getProcess();
 97     for (int i = 0; i < keys.length; i++) {
 98       JMenuItem component = holder.getItem(keys[i]);
 99       try {
100         process(component);
101       }
102       catch (IllegalComponentStateException e) {
103         JOptionPane.showMessageDialog(null,
104                                       "Başarısız oldu,Tekrar deneyiniz..",
105                                       "Hata", JOptionPane.ERROR_MESSAGE);
106         runner.interrupt();
107       }
108       catch (NullPointerException e) {
109         JOptionPane.showMessageDialog(null,
110                                       keys[i] + " bulunamadı...",
111                                       "Hata", JOptionPane.ERROR_MESSAGE);
112         runner.interrupt();
113       }
114     }
115   }
116   public void process(JMenuItem component) {
117     Point end = new Point( (int) Math.floor(component.getLocationOnScreen().
118                                             getX() +
119                                             component.getBounds().getWidth() /
120                                             2),
121                           (int) Math.floor(component.getLocationOnScreen().
122                                            getY() +
123                                            component.getBounds().getHeight() /
124                                            2));
125     moveMouse(startPoint, end);
126     if((component.getText()==process.getProcess()[process.getProcess().length-1])&&!process.getClick()){
127       clickMouse(false);
128     }
129     else{clickMouse(true);}
130     startPoint = new Point( (int) Math.floor(getMouseX()),
131                            (int) Math.floor(getMouseY()));
132   }
133 }

Bu class Runnable interface'ini implement eder ve kısaca şunu yapar;

Robot'u kullanarak fareyi yavaş yavaş verilen bir noktadan başka bir noktaya hareket ettirir.İstenirse farenin sol tuşuna tıklar.

Servant'ın fareyi hangi noktadan hangi noktaya hareket ettireceğimi nerden tayin ediyorum?

Başlangıç noktasını Servant bir help dosyasındaki(html'dir.) göster linkine tıklandığında alıyor ve faremizle belirlenen işlemi yapıyor.

Holder.java

Holder.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 package jhelp;
  2 import java.util.HashMap;
  3 import javax.swing.JMenuItem;
  4 public class Holder{
  5   public static Holder defaultHolder=new Holder();
  6   private HashMap itemHolder;
  7   private Holder() {
  8     itemHolder=new HashMap();
  9   }
 10   public static Holder getDefaultHolder(){
 11     return defaultHolder;
 12   }
 13   public HashMap getHolder(){
 14     return itemHolder;
 15   }
 16   public void hold(JMenuItem item){
 17     itemHolder.put(item.getText(),item);
 18   }
 19   public JMenuItem getItem(Object key){
 20     return (JMenuItem) itemHolder.get(key);
 21   }
 22 }

Farenin bir yerden diğer bir yere götürülmesi için iki parametre gereklidir.

Birinci parametreyi nasıl elde ettiğimi anlattım.Bu bir linke tıklanınca elde ediliyor.ikinci noktayı ise gidilecek olan menünün text'ini vermek suretiyle bu textle HashMap'ten gidilen menü elemanını alıyorum.

JMenuItem component = holder.getItem(keys[i]);

Sonra;

    Point end = new Point( (int) Math.floor(component.getLocationOnScreen().
                                          getX() +
	                                          component.getBounds().getWidth() /
                                           2),
                          	(int) Math.floor(component.getLocationOnScreen().
                                     	      getY() +
                                   	     	  component.getBounds().getHeight() /
                                     	     2));

Not:Servant.java'da

Üstteki kod parçasında kullanıldığı üzere JMenuItem HahMap'ten alınıyor.Bu Holder.javadır.HashMap'in bunları tutması için daha önceden eklenmiş olması gerekmektedir.Bu componentler Frame oluşturulduğunda bir Menubara eklenirken bir de Holder.javaya eklenir.

Process.java

Process.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 package jhelp;
  2 public class Process{
  3   private Object[] process;
  4   public Process(Object[] process,boolean click) {
  5     this.process=process;
  6     setClick(click);
  7   }
  8   private boolean click;
  9   public void setClick(boolean click){
 10     this.click=click;
 11   }
 12   public boolean getClick(){
 13     return click;
 14   }
 15   public void setProcess(Object[] process){
 16     this.process=process;
 17   }
 18   public Object[] getProcess(){
 19     return process;
 20   }
 21 }

Bu class adından anlaşılacağı üzere bir süreci tutar.Mesela File>New>New Project' gelerek tıklanacak.Buraya gelene dek hangi işlemleri gerçekleştirmesi gerekir bilmelidir.Ayrıca MenüItem bulunduktan sonra tıklama yapılacak mı bunu tutmak Process'in işidir.

TestFrame.java

TestFrame.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 package jhelp;
  2 import javax.swing.*;
  3 import java.awt.*;
  4 import java.awt.event.*;
  5 import java.util.Vector;
  6 public class TestFrame extends JFrame{
  7   HelpBox helpBox;
  8   public TestFrame() {
  9     helpBox=new HelpBox(this,"JHelp");
 10     JMenuBar bar=new JMenuBar();
 11     JMenu file=new JMenu("File");
 12     JMenu newElement=new JMenu("New");
 13     file.add(newElement);
 14     JMenuItem newPage=new JMenuItem("New Page");
 15     newElement.add(newPage);
 16     JMenuItem newProject=new JMenuItem("New Project");
 17     newElement.add(newProject);
 18     JMenuItem open=new JMenuItem("Open");
 19     file.add(open);
 20     JMenuItem exit=new JMenuItem("Exit");
 21     file.add(exit);
 22     bar.add(file);
 23     JMenu edit=new JMenu("Edit");
 24     JMenuItem cut=new JMenuItem("Cut");
 25     edit.add(cut);
 26     JMenuItem copy=new JMenuItem("Copy");
 27     edit.add(copy);
 28     JMenuItem paste=new JMenuItem("Paste");
 29     edit.add(paste);
 30     bar.add(edit);
 31     JMenu search=new JMenu("Search");
 32     JMenuItem find=new JMenuItem("Find");
 33     search.add(find);
 34     bar.add(search);
 35     JMenu project=new JMenu("Project");
 36     JMenuItem execute=new JMenuItem("Execute");
 37     project.add(execute);
 38     JMenuItem compile=new JMenuItem("Compile");
 39     project.add(compile);
 40     bar.add(project);
 41     JMenu helpMenu=new JMenu("Help");
 42     JMenuItem help=new JMenuItem("Help Topics");
 43     help.addActionListener(new ActionListener() {
 44       public void actionPerformed(ActionEvent actionEvent) {
 45         helpBox.setVisible(true);
 46       }
 47     });
 48     helpMenu.add(help);
 49     bar.add(helpMenu);
 50     setJMenuBar(bar);
 51     addToHolder(file);
 52     addToHolder(edit);
 53     addToHolder(search);
 54     addToHolder(project);
 55     addToHolder(helpMenu);
 56     setBounds(0,0,500,500);
 57     setVisible(true);
 58   }
 59   public void addToHolder(JMenu menu){
 60     Holder holder=Holder.getDefaultHolder();
 61     holder.hold(menu);
 62       for (int i = 0; i < menu.getItemCount(); i++) {
 63         JMenuItem item = menu.getItem(i);
 64         holder.hold(item);
 65         try{
 66           addToHolder((JMenu)item);
 67         }
 68         catch(ClassCastException e){
 69         }
 70       }
 71   }
 72   public static void main(String[] args) {
 73     new TestFrame();
 74   }
 75 }

TestFrame ile bir frame oluşturuluyor ve İçinede bir ToolBar konuyor.

    	addToHolder(file);
		addToHolder(edit);
		addToHolder(search);
		addToHolder(project);
 		addToHolder(helpMenu);

Kodlarıyla Menü ve Menü elemanları Holder'a ekleniyor.

Programı çalıştırdıktan sonra "Help" Menüsüne gelin ve Help'i açın.

HelpBox.java

HelpBox.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 package jhelp;
  2 import javax.swing.*;
  3 import java.net.URL;
  4 import java.io.*;
  5 import javax.swing.event.*;
  6 import java.awt.*;
  7 import java.awt.event.*;
  8 import java.util.ArrayList;
  9 public class HelpBox
 10     extends JDialog
 11     implements MouseListener {
 12   private Point mouseLocation;
 13   private JTextPane toc, content;
 14   private JSplitPane splitter;
 15   private Process process;
 16   boolean simulate;
 17   public HelpBox(JFrame owner, String title) {
 18     super(owner, title);
 19     process = new Process(null, false);
 20     splitter = new JSplitPane();
 21     toc = new JTextPane();
 22     toc.setEditable(false);
 23     splitter.setLeftComponent(new JScrollPane(toc));
 24     try {
 25       toc.setPage(new File("html\\TOContents.html").toURL());
 26     }
 27     catch (IOException e) {
 28       JOptionPane.showMessageDialog(null,
 29           "TOContents.html Bulunamıyor.\nHtml Dosyalarını indirip doğru yere koyunuz.",
 30           "Hata", JOptionPane.ERROR_MESSAGE);
 31     }
 32     toc.addHyperlinkListener(new HyperlinkListener() {
 33       public void hyperlinkUpdate(HyperlinkEvent e) {
 34         if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
 35           try {
 36             content.setPage(e.getURL());
 37             URL url = e.getURL();
 38             arrangeUtilities(url);
 39           }
 40           catch (IOException ex) {
 41           }
 42         }
 43       }
 44     });
 45     content = new JTextPane();
 46     content.setEditable(false);
 47     try {
 48       if (new File("html\\TOContents.html").exists()) {
 49         content.setPage(new File("html\\info.html").toURL());
 50       }
 51     }
 52     catch (IOException ex) {
 53       JOptionPane.showMessageDialog(null,
 54           "info.html Bulunamıyor.\nHtml Dosyalarını indirip doğru yere koyunuz.",
 55           "Hata", JOptionPane.ERROR_MESSAGE);
 56     }
 57     splitter.setRightComponent(new JScrollPane(content));
 58     splitter.setDividerLocation(150);
 59     content.addHyperlinkListener(new HyperlinkListener() {
 60       public void hyperlinkUpdate(HyperlinkEvent e) {
 61         if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
 62           setSimulate(true);
 63         }
 64       }
 65     });
 66     content.addMouseListener(this);
 67     Container contentPane = getContentPane();
 68     contentPane.add(BorderLayout.CENTER, splitter);
 69     int width = 500;
 70     int height = 400;
 71     int locationX = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth() -
 72         width;
 73     int locationY = 0;
 74     setBounds(locationX, 0, width, height);
 75   }
 76   public void mouseClicked(MouseEvent e) {
 77     Point screen = content.getLocationOnScreen();
 78     int x = (int) Math.floor(screen.getX() + e.getX());
 79     int y = (int) Math.floor(screen.getY() + e.getY());
 80     Point point = new Point(x, y);
 81     setMouseLocation(point);
 82     if (simulate) {
 83       Servant servant = new Servant();
 84       Process process = getProcess();
 85       servant.doTask(getMouseLocation(), process);
 86       setSimulate(false);
 87     }
 88   }
 89   public void mousePressed(MouseEvent mouseEvent) {
 90   }
 91   public void mouseReleased(MouseEvent mouseEvent) {
 92   }
 93   public void mouseEntered(MouseEvent mouseEvent) {
 94   }
 95   public void mouseExited(MouseEvent mouseEvent) {
 96   }
 97   public void setMouseLocation(Point point) {
 98     mouseLocation = point;
 99   }
100   public Point getMouseLocation() {
101     return mouseLocation;
102   }
103   public void setProcess(Process process) {
104     this.process = process;
105   }
106   public Process getProcess() {
107     return process;
108   }
109   public void setSimulate(boolean simulate) {
110     this.simulate = simulate;
111   }
112   public boolean getSimulate() {
113     return simulate;
114   }
115   public void arrangeUtilities(URL url) {
116     String urlToString = url.toString();
117     if (urlToString.indexOf("newPage.html") > 0) {
118       Object[] hold = {
119           "File", "New", "New Page"};
120       process = new Process(hold, false);
121       setProcess(process);
122     }
123     else if (urlToString.indexOf("open.html") > 0) {
124       Object[] hold = {
125           "File", "Open"};
126       process = new Process(hold, false);
127       setProcess(process);
128     }
129     else if (urlToString.indexOf("exit.html") > 0) {
130       Object[] hold = {
131           "File", "Exit"};
132       process = new Process(hold, false);
133       setProcess(process);
134     }
135     else if (urlToString.indexOf("cut.html") > 0) {
136       Object[] hold = {
137           "Edit", "Cut"};
138       process = new Process(hold, false);
139       setProcess(process);
140     }
141     else if (urlToString.indexOf("copy.html") > 0) {
142       Object[] hold = {
143           "Edit", "Copy"};
144       process = new Process(hold, false);
145       setProcess(process);
146     }
147     else if (urlToString.indexOf("paste.html") > 0) {
148       Object[] hold = {
149           "Edit", "Paste"};
150       process = new Process(hold, false);
151       setProcess(process);
152     }
153     else if (urlToString.indexOf("compile.html") > 0) {
154       Object[] hold = {
155           "Project", "Compile"};
156       process = new Process(hold, false);
157       setProcess(process);
158     }
159     else if (urlToString.indexOf("execute.html") > 0) {
160       Object[] hold = {
161           "Project", "Execute"};
162       process = new Process(hold, false);
163       setProcess(process);
164     }
165   }
166 }

Bu class bir JDialog'dur.Bu classta iki adet JTextPane vardır soldaki help'in içindekiler sayfasını(TOContents.html) açar (JTextPane ile web sayfaları görüntülenebilir.).Sağdaki ise tıklanan linklere karşılık gelecek olan yardım sayfasını görüntüler.

TextPane'in Html'i görüntülemesi ve Linkleri belirlenmesi için JtextPane'in

setEditable(false); 

olması gerekir.Yoksa link filan olmaz.Sadece altı çizili mavi yazı çıkar.

toc.addHyperlinkListener(new HyperlinkListener() {
	public void hyperlinkUpdate(HyperlinkEvent e) {

	}
});

Link Eventleri (HyperlinkEvent) HyperlinkListener classı ile alınır.Alınır ve işlenir.

ScreenShot

JHelp Dialog penceresinden Soldakilere tıklandığında yardım konuları yeralır.Solda ise yardım konuları içeriği yer alır.Her yardım konusunda Göster linkine basıldığında faremiz hareket ederek gitmesi gereken yere kendi kendine gider bulur ve durur.

Yardım HTML Dosyaları

Html Dosyalarını İndirimek İçin Tıklayın

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖnceki YokSonrakiSon
Geriİleri
Yazdır