当前位置: 首页 > 知识库问答 >
问题:

在Java中拖动形状

易风华
2023-03-14
public class DragPanel extends JPanel implements MouseListener, MouseMotionListener
{
Graphics2D g2;
Rectangle2D square;
Color colour;

double x1, y1, x2, y2, size;
double offsetX, offsetY;

boolean dragging = false;

构造函数方法:

public DragPanel()
{

x1 = 10.0;
y1 = 10.0;
size = 40.0;
x2 = x1 + size;
y2 = y1 + size;

square = new Rectangle2D.Double(x1, y1, size, size);
colour = Color.BLUE;

setFocusable(true);
addMouseListener(this);
addMouseMotionListener(this);
this.requestFocus();

}

PaintComponent方法和MouseDlold、MousePressed和MouseReleased方法:

public void paintComponent(Graphics g)
{

super.paintComponent(g);
g2 = (Graphics2D) g;
g2.draw(square);
g2.setColor(colour);
g2.draw(square);

}

@Override
public void mouseDragged(MouseEvent ev) 
{
    if (dragging)
    {
    double mx = ev.getX();
    double my = ev.getY();

    x1 = mx - offsetX;
    y1 = mx - offsetY;
    square = new Rectangle2D.Double(x1, y1, size, size);
    repaint();  
    }

}

@Override
public void mousePressed(MouseEvent ev) 
{
double mx = ev.getX();
double my = ev.getY();

if (mx > x1 && mx < x2 && my > y1 && my < y2)
{
    dragging = true;
    offsetX  = mx - x1;
    offsetY = my - y1;
}

}

@Override
public void mouseReleased(MouseEvent arg0) 
{
dragging = false;
}

共有1个答案

慕凡
2023-03-14

在MouseDlowed()中

x1 = mx - offsetX;
y1 = mx - offsetY;

应该是

x1 = mx - offsetX;
y1 = my - offsetY;
x2 = x1 + size;
y2 = y1 + size;

每次移动方块时,都需要更新方块的所有边界。不是将它们显式存储在实例变量中,而是使用内置的矩形2D方法,如getMinX()和getMaxX()

 类似资料:
  • 我是否正确地认为无法在网格窗格中拖动形状?下面是一些代码的链接,这些代码允许用户在屏幕上拖动形状:拖放形状 我希望我的形状具有与上述相同的行为,但我希望它们在GridPane中(最终我希望它们的移动被锁定到X或Y轴以移动到相邻的形状)。 我将以下代码添加到“start”方法中。它使用与示例代码相同的方法创建圆,而是将它们添加到网格中。令人惊讶的是,这消除了他们被拖来拖去的能力。 如果您想测试这一点

  • 图形界面允许您使用不同的类创建图形。 在下面的代码中,我使用3个不同的类创建形状: 产生屏幕图像: 不幸的是,接口不提供任何用于转换的功能。 例如,要将形状移动到新位置,我使用以下方法: 我不喜欢逻辑的实例。 是否有一种更通用的方法可以在不使用instanceof逻辑的面板周围拖动任何形状? 完整示例:

  • 问题内容: 我做了一个绘制椭圆并相互链接的迷你代码,现在我尝试移动椭圆(圆),但是我在编码时遇到了问题 移动两个圆圈,并且直线一定不能移动(Graph节点),请帮帮我,谢谢:)更新后(感谢MadProgrammer),现在我可以移动所有 图形了 问题答案: 基本上,因为可以使用而不是使用 这将确保整个组件被重新粉刷。 虽然我不反对使用repaint(int, int),因为您的绘画过程相对简单,但

  • 我是新来的,最近开始使用AutoIt和selenium在我的web应用程序上执行自动化测试。我目前遇到的情况是,我希望在拖放元素上自动测试(用户可以将文件从桌面/文件夹拖放到web应用程序中)。我知道在selenium中,我可以简单地将文件路径发送到web元素中,但是在这个场景中,我希望能够测试拖放的功能。 我目前正在使用AutoItx4java桥和java编程。总而言之,我需要帮助创建一个脚本,

  • 问题内容: 我正在使用Java。我想根据mousedrag事件绘制矩形。如果用户拖动鼠标,则小程序上的矩形应根据当前鼠标坐标增加或减少。我有以下代码。 在下面的代码中,我使用[b] SelectionArea [/ b]类扩展了在其上执行绘制操作的画布。我在此类中使用[b] image [/ b]变量进行双缓冲,以减少闪烁并保存小程序的先前状态(即,绘制小程序的内容) 但如果我画第一个矩形,代码工

  • 本节,我们将介绍事件监听器的必杀技——拖放。如果没有Events或其它轻量级的JavaScript库,拖放操作将很难开发。我们可以使用Events来为矩形附加mouseover, mousedown, mousemove, mouseup, 和mouseout事件,来处理不同阶段的拖放操作。 图6-5 拖放图形 操作步骤 按照以下步骤,来拖放一个矩形: 1. 链接到Events类: <scrip