Java 杰拉贝尔跟不上老鼠
我有一个小程序,它创建了一个可以被认为是操纵杆的东西。一切正常,但有一个小故障,我不知道如何修复。如果鼠标移动太快,我正在拖动的JLabel会粘住,因为鼠标已经移动到绘制框的外部。我可以增加Jlabel的大小,但是O与鼠标的偏移量太大了。我甚至希望减小大小,但使用此实现时,最大鼠标速度太低。 有没有办法解决这个问题 这是全部代码,顺便说一句,任何人都可以继续编译,看看当鼠标移动太快时到底是什么问题Java 杰拉贝尔跟不上老鼠,java,drag-and-drop,mouseevent,Java,Drag And Drop,Mouseevent,我有一个小程序,它创建了一个可以被认为是操纵杆的东西。一切正常,但有一个小故障,我不知道如何修复。如果鼠标移动太快,我正在拖动的JLabel会粘住,因为鼠标已经移动到绘制框的外部。我可以增加Jlabel的大小,但是O与鼠标的偏移量太大了。我甚至希望减小大小,但使用此实现时,最大鼠标速度太低。 有没有办法解决这个问题 这是全部代码,顺便说一句,任何人都可以继续编译,看看当鼠标移动太快时到底是什么问题 import java.awt.*; import java.awt.event.*; impor
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MainClass implements ActionListener, MouseListener, MouseMotionListener
{
int labelSize = 20;
int screenOffsetX = 58;
int screenOffsetY = 130;
JFrame frame;
JLabel xAxis;
JLabel move;
JLabel drag;
JLabel yAxis;
JLabel xAxisDrag;
JLabel yAxisDrag;
JLabel radio;
JLayeredPane panel;
Robot rob;
public static void main(String[] args)
{
new MainClass();
}
public MainClass()
{
frame = new JFrame("app");
frame.setLayout(null);
frame.setBounds(20, 20, 400, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
move = new JLabel("Movement");
move.setBounds(150, 0, 100, 15);
frame.add(move);
xAxis = new JLabel("X");
xAxis.setBounds(100, 20, 50, 15);
frame.add(xAxis);
yAxis = new JLabel("Y");
yAxis.setBounds(200, 20, 50, 15);
frame.add(yAxis);
drag = new JLabel("Dragging");
drag.setBounds(150, 40, 100, 15);
frame.add(drag);
xAxisDrag = new JLabel("X");
xAxisDrag.setBounds(100, 60, 50, 15);
frame.add(xAxisDrag);
yAxisDrag = new JLabel("Y");
yAxisDrag.setBounds(200, 60, 50, 15);
frame.add(yAxisDrag);
radio = new JLabel("O");
radio.setBounds(0, 0, labelSize, labelSize);
radio.setOpaque(false);
radio.setEnabled(false);
panel = new JLayeredPane();
panel.setBounds(50, 100, 257, 257);
panel.setLayout(null);
panel.setBackground(new Color((float)1.0,(float)1.0,(float)1.0));
panel.setOpaque(true);
panel.add(radio);
radio.setLocation(128, 128);
frame.add(panel);
panel.addMouseMotionListener(this);
panel.addMouseListener(this);
frame.revalidate();
frame.repaint();
}
@Override
public void actionPerformed(ActionEvent e) {}
@Override
public void mouseDragged(MouseEvent e)
{
if(!(e.getPoint().x<0 || e.getPoint().y<0 || e.getPoint().x>257 || e.getPoint().y>257))
{
xAxis.setText("X: "+((e.getPoint().x/4)-32));
yAxis.setText("Y: "+((e.getPoint().y/4)-32));
}
if(e.getPoint().x<0 || e.getPoint().y<0 || e.getPoint().x>257 || e.getPoint().y>257)
{ //Neļauj iziet ārpus paneļa;
try
{
rob = new Robot();
if(e.getPoint().x<0)
rob.mouseMove((screenOffsetX+frame.getX()), (e.getPoint().y+screenOffsetY+frame.getY()));
if(e.getPoint().y<0)
rob.mouseMove((e.getPoint().x+screenOffsetX+frame.getX()), (screenOffsetY+frame.getY()));
if(e.getPoint().x>257)
rob.mouseMove((257+screenOffsetX+frame.getX()), (e.getPoint().y+screenOffsetY+frame.getY()));
if(e.getPoint().y>257)
rob.mouseMove((e.getPoint().x+screenOffsetX+frame.getX()), (257+screenOffsetY+frame.getY()));
}
catch (AWTException e1)
{
e1.printStackTrace();
}
}
if( (e.getPoint().x>=radio.getX() && e.getPoint().x<=radio.getX()+labelSize) &&
(e.getPoint().y>=radio.getY() && e.getPoint().y<=radio.getY()+labelSize)
)
{ //Ja kursors ir uz JLabel, tad pārvieto;
xAxisDrag.setText("X: "+((e.getPoint().x/4)-32));
yAxisDrag.setText("Y: "+((e.getPoint().y/4)-32));
radio.setBounds(e.getPoint().x-(labelSize/2), e.getPoint().y-(labelSize/2), labelSize, labelSize);
}
}
@Override
public void mouseMoved(MouseEvent e)
{
xAxis.setText("X: "+((e.getPoint().x/4)-32));
yAxis.setText("Y: "+((e.getPoint().y/4)-32));
}
@Override
public void mouseClicked(MouseEvent arg0) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e)
{
radio.setLocation(124, 124);
xAxisDrag.setText("X: "+0);
yAxisDrag.setText("Y: "+0);
}
}更换
if( (e.getPoint().x>=radio.getX() && e.getPoint().x<=radio.getX()+labelSize) &&
(e.getPoint().y>=radio.getY() && e.getPoint().y<=radio.getY()+labelSize)
)
{ //Ja kursors ir uz JLabel, tad pārvieto;
xAxisDrag.setText("X: "+((e.getPoint().x/4)-32));
yAxisDrag.setText("Y: "+((e.getPoint().y/4)-32));
radio.setBounds(e.getPoint().x-(labelSize/2), e.getPoint().y-(labelSize/2), labelSize, labelSize);
}
最后,在类MainClass中添加一个名为grab的新字段:
private int grab=0; //idle state
抓取的含义:
1.grab=0=>这是第一次执行MouseDragged函数,但尚未启动抓取。事实上,当你拖动鼠标时,这个函数就像一个无限循环一样迭代,直到你释放鼠标为止。因此,知道它何时开始是很重要的。
2.grab=1=>迭代已开始,但没有抓取
3.抓取=2=>抓取已开始。您可以注意到矫揉造作之前的条件grab==0。事实上,当鼠标被从其他地方拖过收音机,然后收音机被抓住时,我试图避免这种情况。这就是为什么我检查这是第一次迭代。在这种情况下,我们有grab=1=>收音机没有被抓取应该是这样的。若我使用你们的建议,当点击鼠标时,收音机会移动到面板内的任何一点。它需要像我抓起收音机一样,四处移动。@user3665674如果它解决了您的问题,请投票作为答案。确实有效,谢谢。现在我只是简单地复制了它,现在我将再次检查代码,以确保我完全理解它为什么工作。再次感谢。@user3665674。不客气。你忘了对我的答案投赞成票。谢谢。如果可以的话,我会的,有点太没名气了。
@Override
public void mouseReleased(MouseEvent e)
{
//this a new line
//grabbing is over
grab=0; // go back to idle state
radio.setLocation(124, 124);
xAxisDrag.setText("X: "+0);
yAxisDrag.setText("Y: "+0);
}
private int grab=0; //idle state