|
|
![]() |
fidanras79@yahoo.com |
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.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İ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İ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İ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İ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.
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.
Html Dosyalarını İndirimek İçin Tıklayın
|
|