У меня есть JFrame без украшений (без заголовка, кнопки закрытия и т. Д.), Которые можно перетаскивать по экрану с помощью setLocation() и положения мыши.Java mouseExited событие запускается, когда frame.setLocation() называется
К сожалению, событие mouseExited вызывается при первом движении окна ...
- Перемещение мыши в окно и mouseEntered событие обжигают
- Нажмите кнопку мыши и mousePressed событие.
- Перетаскивание мышью и мышью. Опущено событие, и вызывается setLocation.
- событие mouseExited уволено, хотя мышка все еще находится в окне!
- Перемещение мыши из окна в этом месте не будет срабатывать mouseExited.
- Перемещение мыши туда и обратно в сбросит обратно к шагу 1.
Как исправить эту проблему, кроме как раз вручную тестирования положение мыши на экране?
Edit: Вот дистиллированная версия кода
import java.awt.*;
import javax.swing.*;
import java.awt.Event;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
class DragNDropper implements MouseMotionListener, MouseListener
{
private int x, y;
private int dx, dy;
private boolean clicked;
private JFrame frame;
public DragNDropper(JFrame frame)
{
dx = dy = 0;
this.frame = frame;
}
public void mouseDragged(MouseEvent e)
{
x = e.getXOnScreen();
y = e.getYOnScreen();
frame.setLocation(x-dx, y-dy);
}
public void mouseMoved(MouseEvent e)
{
x = e.getXOnScreen();
y = e.getYOnScreen();
}
public void mouseClicked(MouseEvent e)
{
}
public void mousePressed(MouseEvent e)
{
clicked = true;
dx = e.getX();
dy = e.getY();
}
public void mouseReleased(MouseEvent e)
{
clicked = false;
}
public void mouseEntered(MouseEvent e)
{
System.out.println("Mouse entered");
}
public void mouseExited(MouseEvent e)
{
System.out.println("Mouse exited");
}
}
public class Program
{
public static void main(String[] argv)
{
JFrame jf = new JFrame();
DragNDropper dnd = new DragNDropper(jf);
jf.setSize(new Dimension(512, 512));
jf.addMouseListener(dnd);
jf.addMouseMotionListener(dnd);
jf.show();
}
}
Для лучшей помощи раньше, опубликовать [MCVE] (http://stackoverflow.com/help/mcve), обнаружившая проблему. –
@AndrewThompson Сделано. –
'Ошибка: главный метод не найден в классе DragNDropper, пожалуйста, определите основной метод как: public static void main (String [] args)' .. MCVE включает в себя основной. –