Java JPanel子类;跳来跳去;拖拽
我目前正在编写一个小的“绘画”程序;到目前为止,你可以用笔在上面画画,放大到100倍,然后选择一种颜色。我想添加的下一件事是(或是)拖动JPanel子类的可能性,选择要编辑的图像是在该子类上绘制的。基本上,通过按住鼠标右键,可以更改位于JInternalFrame上的JPanel子类的位置。我有一个代码示例,它本身应该运行良好;至少对我来说是这样。要复制此问题,只需启动Java JPanel子类;跳来跳去;拖拽,java,swing,jpanel,drag,mousemotionlistener,Java,Swing,Jpanel,Drag,Mousemotionlistener,我目前正在编写一个小的“绘画”程序;到目前为止,你可以用笔在上面画画,放大到100倍,然后选择一种颜色。我想添加的下一件事是(或是)拖动JPanel子类的可能性,选择要编辑的图像是在该子类上绘制的。基本上,通过按住鼠标右键,可以更改位于JInternalFrame上的JPanel子类的位置。我有一个代码示例,它本身应该运行良好;至少对我来说是这样。要复制此问题,只需启动DragPanelTest类,并在带有红色边框的组件上拖动鼠标-面板不会平滑拖动,而是始终来回跳跃 代码: 请注意,我遗漏了一些
DragPanelTest
类,并在带有红色边框的组件上拖动鼠标-面板不会平滑拖动,而是始终来回跳跃
代码:
请注意,我遗漏了一些System.out.println()
或@Override
命令以将代码缩短一点
无论如何,如果有人知道我做错了什么/需要改进什么,我将非常感激
面板不会平滑拖动,而是始终来回跳跃
由于鼠标与零部件和父面板之间的相对运动处于禁用状态,因此发生跳跃时。您的代码太复杂,无法指出导致问题的确切行
围绕面板拖动零部件的基本代码是:
public class DragListener extends MouseInputAdapter
{
Point location;
MouseEvent pressed;
public void mousePressed(MouseEvent me)
{
pressed = me;
}
public void mouseDragged(MouseEvent me)
{
Component component = me.getComponent();
location = component.getLocation(location);
int x = location.x - pressed.getX() + me.getX();
int y = location.y - pressed.getY() + me.getY();
component.setLocation(x, y);
}
}
有关具有更多功能的更高级代码,您还可以查看中的
组件移动器类。我在移动滚动窗格的视口时遇到类似问题。我认为,重新定位零部件时,保存点的值相对于原始位置,相对于新位置不正确。我的解决方案在我看来似乎不合逻辑,使拖动操作顺利进行。我所做的是将点增量添加回保存的位置
这是拖动视口的基本代码:
Point priorPanPoint;
public void mouseDragged(MouseEvent e) {
Point newPt = subtractPoints(priorPanPoint, e.getPoint());
priorPanPoint = addPoints(e.getPoint(), newPt);
newPt = addPoints(getVisibleRect().getLocation(), newPt);
viewport.setViewPosition(newPt);
}
public void mousePressed(MouseEvent e) {
priorPanPoint = e.getPoint();
}
private Point addPoints(Point p1, Point p2) {
return new Point(p1.x + p2.x, p1.y + p2.y); }
private Point subtractPoints(Point p1, Point p2) {
return new Point(p1.x - p2.x, p1.y - p2.y);
}
它之所以跳跃是因为getMousePosition
。这是相对于当前组件的,但是,由于该组件正在移动,它会影响代码认为鼠标上次移动的位置。
Point priorPanPoint;
public void mouseDragged(MouseEvent e) {
Point newPt = subtractPoints(priorPanPoint, e.getPoint());
priorPanPoint = addPoints(e.getPoint(), newPt);
newPt = addPoints(getVisibleRect().getLocation(), newPt);
viewport.setViewPosition(newPt);
}
public void mousePressed(MouseEvent e) {
priorPanPoint = e.getPoint();
}
private Point addPoints(Point p1, Point p2) {
return new Point(p1.x + p2.x, p1.y + p2.y); }
private Point subtractPoints(Point p1, Point p2) {
return new Point(p1.x - p2.x, p1.y - p2.y);
}