基于Java的鼠标运动图像

基于Java的鼠标运动图像,java,swing,user-interface,graphics,jframe,Java,Swing,User Interface,Graphics,Jframe,好的,我是Java新手,在分配给我的一个项目上遇到了问题。在JFrame上移动CTetrimino对象时遇到问题 这是我的CTetrimino课程 import java.awt.Color; import java.awt.Graphics; import java.awt.Image; public class CTetriMino { public CTetriMino(int type, int x, int y, int w, int h, Color c) { CMin

好的,我是Java新手,在分配给我的一个项目上遇到了问题。在JFrame上移动CTetrimino对象时遇到问题 这是我的CTetrimino课程

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

public class CTetriMino {

public CTetriMino(int type, int x, int y, int w, int h, Color c) 
{
    CMino m = new CMino();
    d = m.getDiameter();
    Type=type;
    X=x;
    Y=y;
    Width=w;
    Height=h;
    FillColor=c;
}

public CTetriMino(CTetriMino src) { // copy constructor
    Type=src.Type;
    X=src.X;
    Y=src.Y;
    Width=src.Width;
    Height=src.Height;
    FillColor=src.FillColor;
}

public int getX() { return X; }
public void setX(int x) { X=x; }
public int getY() { return Y; }
public void setY(int y) { Y=y; }

public void draw(Graphics g) {
    g.setColor(FillColor);
    switch (Type) {
    case 0:
        //g.fillOval(X, Y, Width, Height);
        //break;
        g.fillOval(X, Y, d, d);
        g.fillOval(X+d,Y, d, d);
        g.fillOval(X+d,Y-d, d, d);
        g.fillOval(X+d+d,Y-d, d, d);
        break;
    case 1:
        g.fillRect(X, Y, Width, Height);
        //g.fillOval(X, Y, d, d);
        //g.fillOval(X+d,Y, d, d);
        //g.fillOval(X+d,Y+d, d, d);
        //g.fillOval(X+d+d,Y+d, d, d);
        break;
    case 2:
        g.fillOval(X, Y, d, d);
        g.fillOval(X+d,Y, d, d);
        g.fillOval(X,Y-d, d, d);
        g.fillOval(X+d,Y-d, d, d);
        break;
    case 3:
        g.fillOval(X, Y, d, d);
        g.fillOval(X,Y+d, d, d);
        g.fillOval(X,Y+d+d, d, d);
        g.fillOval(X,Y-d, d, d);
        break;
    case 4:
        g.fillOval(X, Y, d, d);
        g.fillOval(X,Y+d, d, d);
        g.fillOval(X,Y-d, d, d);
        g.fillOval(X+d,Y-d, d, d);
        break;
    case 5:
        g.fillOval(X, Y, d, d);
        g.fillOval(X,Y+d, d, d);
        g.fillOval(X,Y-d, d, d);
        g.fillOval(X-d,Y-d, d, d);
        break;
    case 6:
        g.fillOval(X, Y, d, d);
        g.fillOval(X+d,Y, d, d);
        g.fillOval(X,Y-d, d, d);
        g.fillOval(X-d,Y, d, d);
        break;
        }
    }

public boolean containPoint(int x, int y) {
        switch (Type) {
        case 0:
            {
                double a=Width/2.0;
                double b=Height/2.0;
                double xc=X+a;
                double yc=Y+b;
                System.out.println(a);
                System.out.println(b);
                System.out.println(xc);
                System.out.println(yc);
                System.out.println(((x-xc)*(x-xc)/(a*a)+(y-yc)*(y-yc)/(b*b)<=1.0));
                return ((x-xc)*(x-xc)/(a*a)+(y-yc)*(y-yc)/(b*b)<=1.0);

            }
        case 1:
            return (x>=X && y>=Y && x<X+Width && y<Y+Height);

        }

        return false;
    }





private int Type;   
private int X;
private int Y;
private int Width;
private int Height;
private Color FillColor;
private int d;
}
为此:

case 0:
g.fillOval(X, Y, Width, Height);
break;
在这两种变体中,我都可以拖动绿色正方形。在第二种变体中,我可以拖动红色圆圈。然而,我不能移动我的红色提特里米诺。我只是想知道为什么我不能移动我的红色tetrimino。最终我希望能够移动所有的tetriminos并将它们拖到第二条黑线下删除它们。我还希望能够通过按righr单击来旋转tetriminos。任何代码或建议都将不胜感激。如果你需要更多的信息,我会尽快提供。
谢谢。

如果我理解正确,解决方案如下。 请创建如下所示的图像包。您需要两个事件来拖动标签鼠标,按下标签鼠标来完成此操作。添加图标以标记它应该是您的图像

关键进口

    import java.awt.Point;
事件

   private void jLabel1MousePressed(java.awt.event.MouseEvent evt) {                                     
          initialClick = evt.getPoint();
    }  





     private void jLabel1MouseDragged(java.awt.event.MouseEvent evt) {                                     

        int thisX = jLabel1.getLocation().x;
        int thisY = jLabel1.getLocation().y;

        // Determine how much the mouse moved since the initial click
        int xMoved = (thisX + evt.getX()) - (thisX + initialClick.x);
        int yMoved = (thisY + evt.getY()) - (thisY + initialClick.y);

        // Move picture to this position
        int X = thisX + xMoved;
        int Y = thisY + yMoved;

        jLabel1.setLocation(X, Y);
        jLabel1.repaint();


    }                                    

在这个网站上有很多使用Swing来允许用鼠标拖动图形的例子,其中一些是我和MadProgrammer编写的。您将希望搜索此网站并学习这些示例。谢谢!我会看一看。我试过看你的代码,但遇到了障碍。1) 它的格式很差,很难阅读。我们是在自己的空闲时间投入精力的志愿者,如果您也这样做并在提问时投入精力以使问题易于理解,我们将不胜感激,其中包括发布格式良好且符合通用Java格式标准的代码(您可以通过谷歌轻松找到)。2) 我无法运行你的代码,因为它不是完全独立的,不是一个--请检查链接。我完全理解。虽然你没有回答我的问题,但你帮了我很大的忙。下次我会尽量让我接下来的问题更容易理解。+1感谢您在StackOverflow中的学习努力-欢迎加入+1为漂亮的答案。我在我的绘画应用程序中使用了这种方式,但我将其与小问题进行了比较。在用鼠标定位图像后,我想获得绘图区域的屏幕截图(可移动图片+空格),在通过Robot()拍摄屏幕截图后,标签不会出现在照片中(屏幕截图),只有间隙出现。你对此有什么想法吗?非常感谢
    import java.awt.Point;
   private void jLabel1MousePressed(java.awt.event.MouseEvent evt) {                                     
          initialClick = evt.getPoint();
    }  





     private void jLabel1MouseDragged(java.awt.event.MouseEvent evt) {                                     

        int thisX = jLabel1.getLocation().x;
        int thisY = jLabel1.getLocation().y;

        // Determine how much the mouse moved since the initial click
        int xMoved = (thisX + evt.getX()) - (thisX + initialClick.x);
        int yMoved = (thisY + evt.getY()) - (thisY + initialClick.y);

        // Move picture to this position
        int X = thisX + xMoved;
        int Y = thisY + yMoved;

        jLabel1.setLocation(X, Y);
        jLabel1.repaint();


    }