【发布时间】:2018-10-30 04:17:09
【问题描述】:
我使用与 Java - Custom shaped draggable JFrame 几乎相同的方法来移动 JFrame
我有一个扩展 JPanel 的类。在上述类中,我将之前的 x 和 y 设置为如下变量:
private int pressX, pressY
然后,在 mousePressed 方法中,我有:
pressX = e.getX();
pressY = e.getY();
最后,在 mouseDragged 中,我有:
mainFrame.setLocation((int) Math.round(mainFrame.getLocation().getX() + e.getX() - pressX), (int) Math.round(mainFrame.getLocation().getY() + e.getY() - pressY));
但是,当拖动窗口时,会有相当多的滞后或某种问题。这是一个视频,可以直观地展示发生了什么。
https://i.imgur.com/KWtbE1s.gifv
我正在使用 swing 库,并且正在使用大约每两毫秒滴答一次的 Timer 重新绘制。
编辑:
我修改了代码,使这些点与 JPanel 相关,但问题仍然存在。
dragMe = new Draggable() {
private static final long serialVersionUID = 1L;
private Point press;
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {
press = SwingUtilities.convertPoint(this, e.getPoint(), mainFrame);
}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseDragged(MouseEvent e) {
Point drag = SwingUtilities.convertPoint(this, e.getPoint(), mainFrame);
mainFrame.setLocation((int) Math.round(mainFrame.getLocation().getX() + drag.getX() - press.getX()), (int) Math.round(mainFrame.getLocation().getY() + drag.getY() - press.getY()));
}
@Override
public void mouseMoved(MouseEvent e) {}
};
编辑 2:
不幸的是,我在这里创建的示例完美运行,我不知道为什么它在真实代码中不起作用。我什至尝试将我在这个示例中制作的确切类复制到真实的应用程序中,但在真实的代码中仍然出现问题。
看来我必须对此进行更多研究。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.WindowConstants;
public class Test extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private static JFrame frame;
public static void main(String[] args) {
class Draggable extends JPanel implements MouseListener, MouseMotionListener {
private static final long serialVersionUID = 1L;
private Point press;
public Draggable() {
addMouseListener(this);
addMouseMotionListener(this);
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {
press = SwingUtilities.convertPoint(this, e.getPoint(), frame);
}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseDragged(MouseEvent e) {
Point drag = SwingUtilities.convertPoint(this, e.getPoint(), frame);
frame.setLocation((int) Math.round(frame.getLocation().getX() + drag.getX() - press.getX()), (int) Math.round(frame.getLocation().getY() + drag.getY() - press.getY()));
}
@Override
public void mouseMoved(MouseEvent e) {}
}
Test t = new Test();
t.setBounds(0, 0, 1200, 600);
t.setVisible(true);
Draggable drag = new Draggable();
drag.setBounds(24, 24, 24, 24);
drag.setVisible(true);
Timer repaintTimer = new Timer(2, t);
frame = new JFrame();
frame.setSize(1200, 600);
frame.add(t);
frame.add(drag);
Dimension dim = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLocation((dim.width - frame.getWidth()) / 2, (dim.height - frame.getHeight()) / 2);
frame.getContentPane().setLayout(null);
frame.setAlwaysOnTop(true);
frame.setResizable(false);
repaintTimer.start();
frame.setVisible(true);
frame.requestFocus();
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(24, 24, 24, 24);
}
}
【问题讨论】:
-
“我使用几乎与 Java 相同的方法来移动 JFrame - 自定义形状的可拖动 JFrame” 为了尽快获得更好的帮助,请发布 minimal reproducible example 或 Short, Self Contained, Correct Example 您的代码。
-
@AndrewThompson 编辑可以接受吗?
-
Is the edit acceptable?- 不。我们如何复制/粘贴/编译和测试该代码?
标签: java swing draggable drag mouselistener