第一个问题,在拖动时加上下面的条件,如果超出就返回
第二个问题,键盘和鼠标事件是输入事件,应该能被消费掉的
我也没试,以前都是add,不用时remove掉监听器。                               
               //如果鼠标超出了父容器,则不再移动,也锁定鼠标
                                if (!getParent().contains(
                                          e.getX() + (int) getLocation().getX(),
                                          e.getY() + (int) getLocation().getY())) {
                                                  //锁定鼠标光标
                                          try {
                                                  Robot robot = new java.awt.Robot();
                                                  Point p = getLocationOnScreen();
                                                  robot.mouseMove(p.x + offsetX, p.y + offsetY);
                                          } catch (AWTException ae) {
                                          }
                                          return;
                                }

解决方案 »

  1.   

    第一个明白了,可第二个我原以为应该能consume掉,可事实上却没有,可是我在另一个程序中是这样使的:
    textFiled.addKeyListener(new
      

  2.   

    抱歉,上一个打错了,应该是这样的:
    textFiled.addKeyListener(new
       KeyAdapter()
        public void keyTyped(KeyEvent event)
        {
          char ch=event.getKeyChar();
          if(ch<'0'||ch>'9')
                 event.consume();
        }
    });
    这样就可以屏蔽数字以外的输入
      

  3.   

    Ctrl+Alt+Del、Ctrl+Esc、win键事件恐怕不是java程序能够屏蔽得掉,这么热键不是你的java程序的焦点事件,而是高于一切的系统事件,在程序里能做掉的应该要使用hook程序来进行拦截,进行处理,而不进行传播。
      

  4.   

    呵呵,仔细一看代码,二楼的高手最终还是利用了机器人,我想请教一下,是说java里不能直接控制鼠标的位置吗?
    谢谢了
      

  5.   

    还有能问一下吗,就是那个offestX和offsetY是什么吗,我没看明白这是哪里的偏移量,谢谢了
      

  6.   

    hook程序要使用win32api,所以一般用vc来写较方便,因为还需用到回调函数java应该是只局限于它的jvm的。
      

  7.   

    ………………
    555…………
    哪我怎么办…………
    如果考虑到java虚拟机的话,只能下学期在考虑了,现在是看不懂的…………
    不过确实,虽然我完全没学过vc,但是通过vb也确实的明白win32api在那里的好用,谁叫是M$的东西呢,那现在怎么办,能给我个提示吗,谢谢了
      

  8.   

    to xlent(狄奥) 
    怎么得到任何时候鼠标的屏幕位置呢?//c置位光标到窗体中央,方向键移动import java.awt.*;
    import java.awt.event.*;import javax.swing.*;public class TestRobot extends JFrame{

    Robot robot=null;
    Point p=new Point();
    int offset=2;

    public TestRobot(){


    setSize(512,384);
    this.setExtendedState(JFrame.MAXIMIZED_BOTH);
    Container c=this.getContentPane();

    this.addKeyListener(new KeyAdapter(){
    public void keyPressed(KeyEvent e){
    System.out.println (e);

    //怎么得到任何时候鼠标的屏幕位置呢?
    //Toolkit.getDefaultToolkit().get

    if(e.getKeyCode()==KeyEvent.VK_UP){
    p.y=p.y-offset;
    robot.mouseMove(p.x,p.y);
    }

    if(e.getKeyCode()==KeyEvent.VK_DOWN){
    p.y=p.y+offset;
    robot.mouseMove(p.x,p.y);
    }

    if(e.getKeyCode()==KeyEvent.VK_LEFT){
    p.x=p.x-offset;
    robot.mouseMove(p.x,p.y);
    }

    if(e.getKeyCode()==KeyEvent.VK_RIGHT){
    p.x=p.x+offset;
    robot.mouseMove(p.x,p.y);
    }

    if(e.getKeyCode()==KeyEvent.VK_C){
    p.x=(int)(TestRobot.this.getWidth()/2);
    p.y=(int)(TestRobot.this.getHeight()/2);
    SwingUtilities.convertPointToScreen(p,TestRobot.this);
    robot.mouseMove(p.x,p.y);
    }

    if(e.getKeyCode()==KeyEvent.VK_EQUALS){
    if(offset==50){
    return;
    }
    offset+=2;

    }
    if(e.getKeyCode()==KeyEvent.VK_MINUS){
    if(offset==0){
    return;
    }
    offset-=2;
    }
    }
    });

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    try{
        robot=new Robot();
    }
    catch(AWTException e){
    }
    } public static void main(String[] args){
    new TestRobot();
    }
    }
      

  9.   

    对了,那个offestX和offsetY是随意设吗?
    还有我把上面那段程序放在鼠标监听器中mouseExited(MouseEvent e)里,可是只要移动的很快就可以逃出窗体,可放在mouseMoved中又不起作用,能讲讲是什么原因吗,这样还是实现不了啊,还是我的方法错了?
      

  10.   

    to 楼主
    offsetX和offsetY是我的程序里定义的变量,这里没有去除
    你可以把窗体中座标转换成屏幕座标
    SwingUtilities.convertPointToScreen(Point p,Component c)
      

  11.   

    我是用的mouseEMoved(MouseEvent e)然后用event.getX()和event.getY(),但不知能否成立,这点还没仔细看,不知道是否能行
      

  12.   

    啊~~
    不对,这样也是得到相对于窗体的坐标,我也不懂,我查查api再说
      

  13.   

    //c置位光标到窗体中央,方向键移动//下面那种获取屏幕座标非常勉强。import java.awt.*;
    import java.awt.event.*;import javax.swing.*;public class TestRobot extends JFrame{

    Robot robot=null;
    Point p=new Point();
    int offset=2;

    public TestRobot(){


    setSize(512,384);
    this.setExtendedState(JFrame.MAXIMIZED_BOTH);
    Container c=this.getContentPane();

    this.addMouseListener(new MouseAdapter(){
    public void mousePressed(MouseEvent e){
    p=e.getPoint();
    SwingUtilities.convertPointToScreen(p,TestRobot.this);
    }
    });

    this.addKeyListener(new KeyAdapter(){
    public void keyPressed(KeyEvent e){

    robot.mousePress(MouseEvent.BUTTON1_MASK);

    //怎么得到任何时候鼠标的屏幕位置呢?
    //Toolkit.getDefaultToolkit().get

    if(e.getKeyCode()==KeyEvent.VK_UP){
    p.y-=offset;
    robot.mouseMove(p.x,p.y);
    }

    if(e.getKeyCode()==KeyEvent.VK_DOWN){
    p.y+=offset;
    robot.mouseMove(p.x,p.y);
    }

    if(e.getKeyCode()==KeyEvent.VK_LEFT){
    p.x-=offset;
    robot.mouseMove(p.x,p.y);
    }

    if(e.getKeyCode()==KeyEvent.VK_RIGHT){
    p.x+=offset;
    robot.mouseMove(p.x,p.y);
    }

    if(e.getKeyCode()==KeyEvent.VK_C){
    p.x=(int)(TestRobot.this.getWidth()/2);
    p.y=(int)(TestRobot.this.getHeight()/2);
    SwingUtilities.convertPointToScreen(p,TestRobot.this);
    robot.mouseMove(p.x,p.y);
    }

    if(e.getKeyCode()==KeyEvent.VK_EQUALS){
    if(offset==50){
    return;
    }
    offset+=2;

    }
    if(e.getKeyCode()==KeyEvent.VK_MINUS){
    if(offset==0){
    return;
    }
    offset-=2;
    }
    }
    });

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    try{
        robot=new Robot();
    }
    catch(AWTException e){
    }
    } public static void main(String[] args){
    new TestRobot();
    }
    }
      

  14.   

    这倒是,不过我在1.3的api中还真没看到那个是返回相对于屏幕的坐标(也又可能是我没找到),也就是说只能用窗体坐标加相对于窗体的坐标偏移量来近似得到了
      

  15.   

    对了,现在还是没有解决让鼠标定位的问题,沿用第一个程序改变一下
    private class MListener extends MouseAdapter
    {
    public void mouseExited(MouseEvent e)
    {
    if (!getParent().contains(e.getX() + (int) getLocation().getX(),e.getY() + (int) getLocation().getY())) 
    {//锁定鼠标光标
    try
    {
    Robot robot = new java.awt.Robot();
    Point p = getLocationOnScreen();
    robot.mouseMove(p.x+70, p.y+45);
    }
    catch (AWTException ae)
    {}
    return;
    }
    }
    }
    结果就如我干才说的那样,如果移动不快的话,每次一移到窗体外鼠标能回来,但是如果移动的较快的话,而且是一直往一个方向移动的话,则鼠标第一次会回到窗体,而紧接着就移出去了…………
    也就是说,机器人的创建是要耗费一定时间的,而在这之间的移动恰巧没有被鼠标监听器接受到,导致鼠标可以移出,能问一下这个怎么办吗,一开始我想在“robot.mouseMove(p.x+70, p.y+45);”之前加入while(true),并在之后加入一个小延迟,如delay(10);可这样的话鼠标将一直不断的移到这点,于是就什么事也干不了了…………
    这个怎么解决啊,谢了
      

  16.   

    while(!getParent().contains(e.getX() + (int) getLocation().getX(),e.getY() + (int) getLocation().getY())) 
    {//锁定鼠标光标
    try
    {
    Robot robot = new java.awt.Robot();
    Point p = getLocationOnScreen(); robot.mouseMove(p.x+70, p.y+45);
    }
    catch (AWTException ae)
    {}
    return;
    }
    改成这样后,好一点,但是仍解决不了移动过快的问题,还有就是能不能就是说让一个窗体永远得到焦点,这样的话也相当于防止了鼠标外出,不过又这样的函数吗?
    谢了!