sealyu

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  121 随笔 :: 82 文章 :: 24 评论 :: 0 Trackbacks

2008年4月10日 #

最近做项目的时候碰到一个问题:
在js里面使用window.close(),IE下工作正常,但是FireFox下有时可以,有时不行。
搜索发现,可以这样解决:
<script   language="javascript"   type="text/javascript">  
   
  function   closeWindow()   {  
   
  window.open('','_parent','');  
   
  window.close();  
   
  }  
   
  </script>    
  <a   href="javascript:closeWindow();">Close   Window</a>
 
在前面加一句  window.open('','_parent','');  
作用为:
fool   the   browser   into   thinking   that   it   was   opened   with   a   script  
  This   opens   a   new   page,   (non-existent),   into   a   target   frame/window,   (_parent   which   of   course   is   the   window   in   which   the   script   is   executed,   so   replacing   itself),   and   defines   parameters   such   as   window   size   etc,   (in   this   case   none   are   defined   as   none   are   needed).   Now   that   the   browser   thinks   a   script   opened   a   page   we   can   quickly   close   it   in   the   standard   way…
posted @ 2008-04-10 22:51 seal 阅读(899) | 评论 (3)编辑 收藏

最近在学习SWT/JFace,在做一个小东西的时候需要模拟鼠标键盘事件,在网上搜了一下,在java中模拟这些事件,主要有两种方法:

一、使用AWT中的Robot类

Robot

java.lang.Object
继承者 java.awt.Robot

public class Robot
extends Object
此类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。Robot 的主要目的是便于 Java 平台实现自动测试。类中几个主要的模拟函数如下:
void keyPress(int keycode)
          按下给定的键。
 void keyRelease(int keycode)
          释放给定的键。
 void mouseMove(int x, int y)
          将鼠标指针移动到给定屏幕坐标。
 void mousePress(int buttons)
          按下一个或多个鼠标按钮。
 void mouseRelease(int buttons)
          释放一个或多个鼠标按钮。
 void mouseWheel(int wheelAmt)
          在配有滚轮的鼠标上旋转滚轮。
二、使用SWT中的鼠标键盘事件
    在SWT的snippets中有两个例子用来介绍这两个方法的使用,如下:

(1)、模拟鼠标事件
 * UI Automation (for testing tools) snippet: post mouse events
import org.eclipse.swt.*;
public class Snippet142 {
public static void main(String[] args) {
 final Display display = new Display();
 final Shell shell = new Shell(display);
 final Button button = new Button(shell,SWT.NONE);
 button.setSize(100,100);
 button.setText("Click");
 shell.pack();
 shell.open();
 button.addListener(SWT.MouseDown, new Listener() {
  public void handleEvent(Event e){
   System.out.println("Mouse Down (button: " + e.button + " x: " + e.x + " y: " + e.y + ")");
  }
 });
 final Point pt = display.map(shell, null, 50, 50);
 new Thread(){
  Event event;
  public void run(){
   try {
    Thread.sleep(300);
   } catch (InterruptedException e) {}
   event = new Event();
   event.type = SWT.MouseMove;
   event.x = pt.x;
   event.y = pt.y;
   display.post(event);
   try {
    Thread.sleep(300);
   } catch (InterruptedException e) {}
   event.type = SWT.MouseDown;
   event.button = 1;
   display.post(event);
   try {
    Thread.sleep(300);
   } catch (InterruptedException e) {}
   event.type = SWT.MouseUp;
   display.post(event);
  } 
 }.start();
 while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) display.sleep();
 }
 display.dispose();
}
}
(2)、模拟键盘事件

 * UI Automation (for testing tools) snippet: post key events
import org.eclipse.swt.*;
public class Snippet146 {
public static void main(String[] args) {
 final Display display = new Display();
 final Shell shell = new Shell(display);
 final Text text = new Text(shell, SWT.BORDER);
 text.setSize(text.computeSize(150, SWT.DEFAULT));
 shell.pack();
 shell.open();
 new Thread(){
  public void run(){
   String string = "Love the method.";
   for (int i = 0; i < string.length(); i++) {
    char ch = string.charAt(i);
    boolean shift = Character.isUpperCase(ch);
    ch = Character.toLowerCase(ch);
    if (shift) {
     Event event = new Event();
     event.type = SWT.KeyDown;
     event.keyCode = SWT.SHIFT;
     display.post(event); 
    }
    Event event = new Event();
    event.type = SWT.KeyDown;
    event.character = ch;
    display.post(event);
    try {
     Thread.sleep(10);
    } catch (InterruptedException e) {}
    event.type = SWT.KeyUp;
    display.post(event);
    try {
     Thread.sleep(100);
    } catch (InterruptedException e) {}
    if (shift) {
     event = new Event();
     event.type = SWT.KeyUp;
     event.keyCode = SWT.SHIFT;
     display.post(event); 
    }
   }
  } 
 }.start();
 while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) display.sleep();
 }
 display.dispose();
}
}
两种方法中都是先声明一个Event,然后将该Event的type类型设置为对应的 SWT.KeyUp/KeyDown/MouseUp/MouseDown,最后通过Display类的post(Event)方法来模拟对应的事件。注 意:如果有多个控件,需要得到对应控件的display属性,然后post该事件。例如,在一个窗口中有一个Browser,则需要使用 thisClass.browser.getDisplay().post(event)。

posted @ 2008-04-10 22:42 seal 阅读(156) | 评论 (0)编辑 收藏

     摘要: 最近用到了SWT 中的Browser类,这个类不允许被继承,在网上搜索的时候发现了下面的帖子。这个类实际上是使用OLE,将IE直接嵌套进SWT程序中去。下面代码的 修改实际上将SWT中的WebBrowser类的子类IE直接和Browser 类合到一起,而同时也就没有了原来SWT中的跨平台的优点。该作者添加了setHtml这个函数和_text属性。从而得到对应的网页的html内容。 /*...  阅读全文
posted @ 2008-04-10 22:35 seal 阅读(131) | 评论 (0)编辑 收藏