第一个问题,在拖动时加上下面的条件,如果超出就返回
第二个问题,键盘和鼠标事件是输入事件,应该能被消费掉的
我也没试,以前都是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;
}
第二个问题,键盘和鼠标事件是输入事件,应该能被消费掉的
我也没试,以前都是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;
}
textFiled.addKeyListener(new
textFiled.addKeyListener(new
KeyAdapter()
public void keyTyped(KeyEvent event)
{
char ch=event.getKeyChar();
if(ch<'0'||ch>'9')
event.consume();
}
});
这样就可以屏蔽数字以外的输入
谢谢了
555…………
哪我怎么办…………
如果考虑到java虚拟机的话,只能下学期在考虑了,现在是看不懂的…………
不过确实,虽然我完全没学过vc,但是通过vb也确实的明白win32api在那里的好用,谁叫是M$的东西呢,那现在怎么办,能给我个提示吗,谢谢了
怎么得到任何时候鼠标的屏幕位置呢?//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();
}
}
还有我把上面那段程序放在鼠标监听器中mouseExited(MouseEvent e)里,可是只要移动的很快就可以逃出窗体,可放在mouseMoved中又不起作用,能讲讲是什么原因吗,这样还是实现不了啊,还是我的方法错了?
offsetX和offsetY是我的程序里定义的变量,这里没有去除
你可以把窗体中座标转换成屏幕座标
SwingUtilities.convertPointToScreen(Point p,Component c)
不对,这样也是得到相对于窗体的坐标,我也不懂,我查查api再说
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();
}
}
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);可这样的话鼠标将一直不断的移到这点,于是就什么事也干不了了…………
这个怎么解决啊,谢了
{//锁定鼠标光标
try
{
Robot robot = new java.awt.Robot();
Point p = getLocationOnScreen(); robot.mouseMove(p.x+70, p.y+45);
}
catch (AWTException ae)
{}
return;
}
改成这样后,好一点,但是仍解决不了移动过快的问题,还有就是能不能就是说让一个窗体永远得到焦点,这样的话也相当于防止了鼠标外出,不过又这样的函数吗?
谢了!