当框架在屏幕上移动时,java鼠标不会保持其位置
这是代码
import java.awt.Color;
import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;
public class Paint extends JPanel implements MouseMotionListener, MouseListener {
public Paint() {
setBackground(Color.RED);
addMouseMotionListener(this);
addMouseListener(this);
}
private boolean clicked = false;
public void paintComponent (Graphics g) {
super.paintComponent(g);
PointerInfo a = MouseInfo.getPointerInfo();
Point b = a.getLocation();
int x = (int) b.getX() - 3;
int y = (int) b.getY() - 23;
if (clicked) {
g.drawLine(x, y-5000, x,y+5000);
g.drawLine(x+5000,y,x-5000,y);
g.setColor(Color.white);
}
g.drawLine(x, y-5000, x,y+5000);
g.drawLine(x+5000,y,x-5000,y);
g.setColor(Color.black);
// . . .
}
@Override
public void mouseDragged(MouseEvent e) {
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
clicked = true;
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
clicked = false;
repaint();
}
}
public class Frame extends JFrame {
public Frame() {
this.setSize(500,500);
this.setTitle("Test painting");
this.setResizable(false);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
Paint panel = new Paint();
this.add(panel);
this.setVisible(true);
}
public static void main (String[] args) {
new Frame();
}
}
当我运行程序时,当应用程序处于默认位置时,它看起来工作正常,但一旦我将小程序移动到屏幕上我喜欢的位置,这些行就不会保持屏幕上当前的鼠标位置
有人能告诉我哪里出了问题,或者如何解决这个问题吗
# 1 楼答案
绘画是从组件的上下文中完成的。翻译任何给定组件的
Graphics
上下文,以便左上角为0x0MouseInfo.getPointerInfo().getLocation()
返回鼠标在屏幕上的位置,而不是相对于组件的位置虽然有办法解决这个问题,但更好的解决方案是简单地使用
MouseMotionListener
。发送到此方法的MouseEvent
已被转换为组件坐标空间然后在
paintComponent
方法中,简单地引用myPoint
,而不是尝试使用MouseInfo
# 2 楼答案
我认为最好在MouseApter中更改类的状态,调用中使用MouseInfo更干净、更安全
除此之外,如果您需要更具体的帮助,请考虑repaint()
,然后让paintComponent(...)
方法使用这个状态来帮助它绘制。对我来说,这似乎比在^{