Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 杰拉贝尔跟不上老鼠_Java_Drag And Drop_Mouseevent - Fatal编程技术网

Java 杰拉贝尔跟不上老鼠

Java 杰拉贝尔跟不上老鼠,java,drag-and-drop,mouseevent,Java,Drag And Drop,Mouseevent,我有一个小程序,它创建了一个可以被认为是操纵杆的东西。一切正常,但有一个小故障,我不知道如何修复。如果鼠标移动太快,我正在拖动的JLabel会粘住,因为鼠标已经移动到绘制框的外部。我可以增加Jlabel的大小,但是O与鼠标的偏移量太大了。我甚至希望减小大小,但使用此实现时,最大鼠标速度太低。 有没有办法解决这个问题 这是全部代码,顺便说一句,任何人都可以继续编译,看看当鼠标移动太快时到底是什么问题 import java.awt.*; import java.awt.event.*; impor

我有一个小程序,它创建了一个可以被认为是操纵杆的东西。一切正常,但有一个小故障,我不知道如何修复。如果鼠标移动太快,我正在拖动的JLabel会粘住,因为鼠标已经移动到绘制框的外部。我可以增加Jlabel的大小,但是O与鼠标的偏移量太大了。我甚至希望减小大小,但使用此实现时,最大鼠标速度太低。 有没有办法解决这个问题

这是全部代码,顺便说一句,任何人都可以继续编译,看看当鼠标移动太快时到底是什么问题

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