gpt4 book ai didi

java - GUI 中的鼠标拖动

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:15:15 25 4
gpt4 key购买 nike

我想要这段代码做的是当我按下并拖动屏幕上的红球时,我希望它随着鼠标光标移动,这段代码完成了这项工作并且部分取自 Sun 代码,所以假设提高效率,但如果我移动鼠标太快,它就会停止拖动鼠标...

我该如何克服这个问题?

    public class SwingPaintDemo3 {

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}

private static void createAndShowGUI() {
JFrame f = new JFrame("Swing Paint Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new MyPanel());
f.pack();
f.setVisible(true);
}
}

class MyPanel extends JPanel {

private int X = 0;
private int Y = 0;
private int R = 20;


public MyPanel() {

addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY())) moveVertex(e.getX(),e.getY());
}
});

addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY())) moveVertex(e.getX(),e.getY());
}
});

}

private void moveVertex(int x, int y) {
int OFFSET = 1;
if ((X!=x) || (Y!=y)) {
repaint(X,Y,R+OFFSET,R+OFFSET);
X=x-10;
Y=y-10;
repaint(X,Y,R+OFFSET,R+OFFSET);
}
}


public Dimension getPreferredSize() {
return new Dimension(250,200);
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("This is my custom Panel!",10,20);
g.setColor(Color.RED);
g.fillOval(X,Y,R,R);
g.setColor(Color.BLACK);
g.drawOval(X,Y,R,R);
}
}

最佳答案

出现此问题是因为事件处理程序 Java 的线程不够快,无法在您移动鼠标太快时处理 mouseDragged 事件。所以说你的鼠标指针在圆的中心,但是你在某些方向上移动得非常快,因此只有当鼠标在圆区域之外时才会触发 mouseDragged 事件,所以鼠标指针不是“与 cicle "了。

解决此问题的方法是使用具有 mouseButton 状态的 boolean 变量,如果在圆圈内单击鼠标,您将使圆圈随鼠标移动到任何地方!如果对方松开鼠标按钮,您的鼠标就会移动。

    class MyPanel extends JPanel {
...
private boolean holdedInsideCircle = false;


public MyPanel() {

addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY()))
moveVertex(e.getX(),e.getY());
holdedInsideCircle = true;
}
@Override
public void mouseReleased(MouseEvent e) {
//Doesn't matter where, if the mouse button is released
holdedInsideCircle = false;
}
});


addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
//if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY()))
if(holdedInsideCircle)
moveVertex(e.getX(),e.getY());
}
});

}

关于java - GUI 中的鼠标拖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8716483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com