用户单击它之后,如何在Graphics2D上移动图像

发布于 2025-02-10 00:25:21 字数 11391 浏览 1 评论 0原文

我实现了mouselistenerMousepressed,我得到了X轴和Y轴,将作品定位在按下鼠标时,然后在Mousereareed ,我得到X轴和Y轴时,释放鼠标时将其放置在零件上。我想制作被按下的作品,即bufferedimage,移至释放鼠标的位置。我试图重新绘制并重新粉刷graphics2d,但这无效。

代码:

public class NewBoard extends JPanel implements MouseListener{
static public Font font;
private Map<Integer, Character> x_AxisMap = new HashMap<Integer, Character>();
private Map<Integer, Character> y_AxisMap = new HashMap<Integer, Character>();
public int[][] positions = {{0, 1, 2, 3, 4, 5, 6, 7}, 
                     {8, 9, 10, 11, 12, 13, 14, 15}, 
                     {16, 17, 18, 19, 20, 21, 22, 23}, 
                     {24, 25, 26, 27, 28, 29, 30, 31}, 
                     {32, 33, 34, 35, 36, 37, 38, 39}, 
                     {40, 41, 42, 43, 44, 45, 46, 47}, 
                     {48, 49, 50, 51, 52, 53, 54, 55}, 
                     {56, 57, 58, 59, 60, 61, 62, 63}};

public Map<Integer, String> piecePosition = new HashMap<Integer, String>();
public NewBoard(){
    try { font = Font.createFont(Font.TRUETYPE_FONT, new File("AlphaRomaineFont.ttf"));
    }
    catch(IOException | FontFormatException e){
        e.printStackTrace(); 
    }


    addMouseListener(this);
    setBackground(Color.decode("#ebe4e4"));


    for(int i = 0; i <= 63; i++){
        if(i == 0 || i == 7) piecePosition.put(i, "black ROOK");
        if(i == 1 || i == 6) piecePosition.put(i, "black KNIGHT");
        if(i == 2 || i == 5) piecePosition.put(i, "black BISHOP");
        if(i == 3) piecePosition.put(i, "black QUEEN");
        if(i == 4) piecePosition.put(i, "black KING");
        if(i >= 8 && i <= 15) piecePosition.put(i, "black PAWN");

        if(i == 56 || i == 63) piecePosition.put(i, "white ROOK");
        if(i == 57 || i == 62) piecePosition.put(i, "white KNIGHT");
        if(i == 58 || i == 61) piecePosition.put(i, "white BISHOP");
        if(i == 59) piecePosition.put(i, "white QUEEN");
        if(i == 60) piecePosition.put(i, "white KING");
        if(i >= 48 && i <= 55) piecePosition.put(i, "white PAWN");

        if(i >= 16 && i <= 47) piecePosition.put(i, null);
    }

    System.out.println(piecePosition);
    String a ="abcdefgh";
    String n = "87654321";
    for(int i = 0; i <= 7; i++){
        x_AxisMap.put(i, a.charAt(i));
    }
    
    for(int i = 0; i <= 7; i++){
        y_AxisMap.put(i, n.charAt(i));
    }
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(720, 720);
}
@Override
protected void paintComponent (Graphics graphic){
    super.paintComponent(graphic);
    Graphics2D g2d = (Graphics2D) graphic.create();
    boolean color = true;
    g2d.setFont(new Font("AlphaRomaineFont.ttf", Font.PLAIN, 18));
        for(int y = 0; y < 8; y++){
            for(int x = 0; x < 8; x++){
                if(color){
                    g2d.setColor(Color.decode("#f7e7ce")); //bright 
                }
                else if(!color){
                    g2d.setColor(Color.decode("#B58863")); //dark
                }
                g2d.fillRect(x*(getWidth()/8), y*(getHeight()/8), getWidth()/8, getHeight()/8);

                if(y == 7){
                    g2d.setColor(Color.BLACK);
                    g2d.drawString(String.valueOf(x_AxisMap.get(x)), x*(getWidth()/8)+3,  y*(getHeight()/8)+87);
                    if(color){
                        g2d.setColor(Color.decode("#f7e7ce"));
                    }
                    else if(!color){
                        g2d.setColor(Color.decode("#B58863"));
                    }
                }

                if(x == 7){
                    g2d.setColor(Color.BLACK);
                    g2d.drawString(String.valueOf(y_AxisMap.get(y)), x*(getWidth()/8)+80,  y*(getHeight()/8)+15);
                    if(color){
                        g2d.setColor(Color.decode("#f7e7ce"));
                    }
                    else if(!color){
                        g2d.setColor(Color.decode("#B58863"));
                    }
                }
                if(y == 0){
                    if(x == 0 || x == 7){
                        Image piece = Piece.ROOK.black();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 1 || x == 6){
                        Image piece = Piece.KNIGHT.black();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 2 || x == 5){
                        Image piece = Piece.BISHOP.black();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 3){
                        Image piece = Piece.QUEEN.black();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);


                    }
                    if(x == 4){
                        Image piece = Piece.KING.black();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                }
                if(y == 1){
                    Image piece = Piece.PAWN.black();
                    g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                }

                if(y == 6){
                    Image piece = Piece.PAWN.white();
                    g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                }

                if(y == 7){
                    if(x == 0 || x == 7){
                        Image piece = Piece.ROOK.white();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 1 || x == 6){
                        Image piece = Piece.KNIGHT.white();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 2 || x == 5){
                        Image piece = Piece.BISHOP.white();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 3){
                        Image piece = Piece.QUEEN.white();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 4){
                        Image piece = Piece.KING.white();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                }
                color = !color;

            }
            color = !color;
        }

    }   
private BufferedImage pressedPiece;
private int pressedPosition;
private int pressedX;
private int pressedY;


private BufferedImage releasedPiece;
private int releasedPosition;
private int releasedX;
private int releasedY;
@Override
public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub

}
@Override
public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub
    System.out.println("Pressed");
    if(getPiece(e.getX(), e.getY()) != null){
        String[] split = getPiece(e.getX(), e.getY()).split(" ");
        if(split[0].equals("white")){
            if(split[1].equals("PAWN")) pressedPiece = Piece.PAWN.white();
            if(split[1].equals("ROOK")) pressedPiece = Piece.ROOK.white();
            if(split[1].equals("KNIGHT")) pressedPiece = Piece.KNIGHT.white();
            if(split[1].equals("BISHOP")) pressedPiece = Piece.BISHOP.white();
            if(split[1].equals("QUEEN")) pressedPiece = Piece.QUEEN.white();
            if(split[1].equals("KING")) pressedPiece = Piece.KING.white();
        }
        if(split[0].equals("black")){
            if(split[1].equals("PAWN")) pressedPiece = Piece.PAWN.black();
            if(split[1].equals("ROOK")) pressedPiece = Piece.ROOK.black();
            if(split[1].equals("KNIGHT")) pressedPiece = Piece.KNIGHT.black();
            if(split[1].equals("BISHOP")) pressedPiece = Piece.BISHOP.black();
            if(split[1].equals("QUEEN")) pressedPiece = Piece.QUEEN.black();
            if(split[1].equals("KING")) pressedPiece = Piece.KING.black();
        }
    }


    pressedX = e.getX()/(getWidth()/8);
    pressedY = e.getY()/(getWidth()/8);
    pressedPosition = getNumberPosition(pressedX, pressedY);
    setBackground(Color.decode("#cf1e15"));
    setOpaque(true);
}
@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub
    System.out.println("Released");
    if(getPiece(e.getX(), e.getY()) != null){
        String[] split = getPiece(e.getX(), e.getY()).split(" ");
        if(split[0].equals("white")){
            if(split[1].equals("PAWN")) releasedPiece = Piece.PAWN.white();
            if(split[1].equals("ROOK")) releasedPiece = Piece.ROOK.white();
            if(split[1].equals("KNIGHT")) releasedPiece = Piece.KNIGHT.white();
            if(split[1].equals("BISHOP")) releasedPiece = Piece.BISHOP.white();
            if(split[1].equals("QUEEN")) releasedPiece = Piece.QUEEN.white();
            if(split[1].equals("KING")) releasedPiece = Piece.KING.white();
        }
        if(split[0].equals("black")){
            if(split[1].equals("PAWN")) releasedPiece = Piece.PAWN.black();
            if(split[1].equals("ROOK")) releasedPiece = Piece.ROOK.black();
            if(split[1].equals("KNIGHT")) releasedPiece = Piece.KNIGHT.black();
            if(split[1].equals("BISHOP")) releasedPiece = Piece.BISHOP.black();
            if(split[1].equals("QUEEN")) releasedPiece = Piece.QUEEN.black();
            if(split[1].equals("KING")) releasedPiece = Piece.KING.black();
        }
    }

    releasedX = e.getX()/(getWidth()/8);
    releasedY = e.getY()/(getWidth()/8);
    releasedPosition = getNumberPosition(releasedX, releasedY);
    makeChanges();
}
@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub
    //System.out.println("Entered");
}
@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub
    //System.out.println("Exited");
}

private String getPiece(int x, int y){
     x = x/(getWidth()/8);
     y = y/(getWidth()/8);

    System.out.println(piecePosition.get(positions[y][x]));
    return piecePosition.get(positions[y][x]);
}
private int getNumberPosition(int x, int y){
    return positions[y][x];
}
public void makeChanges(){
    if(pressedPosition != releasedPosition){
        String pressedColor = "";
        String releasedColor = "";
        if((pressedY % 2 == 0 && pressedX % 2 == 0) || (pressedY % 2 != 0 && pressedX % 2 != 0)) pressedColor = "#f7e7ce";
        if((pressedY % 2 == 0 && pressedX % 2 != 0) || (pressedY % 2 != 0 && pressedX % 2 == 0)) pressedColor = "#B58863";

        if((releasedY % 2 == 0 && releasedX % 2 == 0) || (releasedY % 2 != 0 && releasedX % 2 != 0)) releasedColor = "#f7e7ce";
        if((releasedY % 2 == 0 && releasedX % 2 != 0) || (releasedY % 2 != 0 && releasedX % 2 == 0)) releasedColor = "#B58863";

        
        //if(!tempColor.equals("")) g2d.setColor(Color.decode(tempColor));
        //else g2d.setColor(Color.RED);
    }
}
}

I implemented MouseListener and on mousePressed, I get the x-axis and y-axis the piece is positioned on when the mouse is pressed, and on mouseReleased, I get the x-axis and y-axis the piece is positioned on when the mouse is released. I want to make the piece that was pressed, which is a BufferedImage, move to the location of where the mouse was released. I tried to redraw and repaint the Graphics2D but that did not work.

Code:

public class NewBoard extends JPanel implements MouseListener{
static public Font font;
private Map<Integer, Character> x_AxisMap = new HashMap<Integer, Character>();
private Map<Integer, Character> y_AxisMap = new HashMap<Integer, Character>();
public int[][] positions = {{0, 1, 2, 3, 4, 5, 6, 7}, 
                     {8, 9, 10, 11, 12, 13, 14, 15}, 
                     {16, 17, 18, 19, 20, 21, 22, 23}, 
                     {24, 25, 26, 27, 28, 29, 30, 31}, 
                     {32, 33, 34, 35, 36, 37, 38, 39}, 
                     {40, 41, 42, 43, 44, 45, 46, 47}, 
                     {48, 49, 50, 51, 52, 53, 54, 55}, 
                     {56, 57, 58, 59, 60, 61, 62, 63}};

public Map<Integer, String> piecePosition = new HashMap<Integer, String>();
public NewBoard(){
    try { font = Font.createFont(Font.TRUETYPE_FONT, new File("AlphaRomaineFont.ttf"));
    }
    catch(IOException | FontFormatException e){
        e.printStackTrace(); 
    }


    addMouseListener(this);
    setBackground(Color.decode("#ebe4e4"));


    for(int i = 0; i <= 63; i++){
        if(i == 0 || i == 7) piecePosition.put(i, "black ROOK");
        if(i == 1 || i == 6) piecePosition.put(i, "black KNIGHT");
        if(i == 2 || i == 5) piecePosition.put(i, "black BISHOP");
        if(i == 3) piecePosition.put(i, "black QUEEN");
        if(i == 4) piecePosition.put(i, "black KING");
        if(i >= 8 && i <= 15) piecePosition.put(i, "black PAWN");

        if(i == 56 || i == 63) piecePosition.put(i, "white ROOK");
        if(i == 57 || i == 62) piecePosition.put(i, "white KNIGHT");
        if(i == 58 || i == 61) piecePosition.put(i, "white BISHOP");
        if(i == 59) piecePosition.put(i, "white QUEEN");
        if(i == 60) piecePosition.put(i, "white KING");
        if(i >= 48 && i <= 55) piecePosition.put(i, "white PAWN");

        if(i >= 16 && i <= 47) piecePosition.put(i, null);
    }

    System.out.println(piecePosition);
    String a ="abcdefgh";
    String n = "87654321";
    for(int i = 0; i <= 7; i++){
        x_AxisMap.put(i, a.charAt(i));
    }
    
    for(int i = 0; i <= 7; i++){
        y_AxisMap.put(i, n.charAt(i));
    }
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(720, 720);
}
@Override
protected void paintComponent (Graphics graphic){
    super.paintComponent(graphic);
    Graphics2D g2d = (Graphics2D) graphic.create();
    boolean color = true;
    g2d.setFont(new Font("AlphaRomaineFont.ttf", Font.PLAIN, 18));
        for(int y = 0; y < 8; y++){
            for(int x = 0; x < 8; x++){
                if(color){
                    g2d.setColor(Color.decode("#f7e7ce")); //bright 
                }
                else if(!color){
                    g2d.setColor(Color.decode("#B58863")); //dark
                }
                g2d.fillRect(x*(getWidth()/8), y*(getHeight()/8), getWidth()/8, getHeight()/8);

                if(y == 7){
                    g2d.setColor(Color.BLACK);
                    g2d.drawString(String.valueOf(x_AxisMap.get(x)), x*(getWidth()/8)+3,  y*(getHeight()/8)+87);
                    if(color){
                        g2d.setColor(Color.decode("#f7e7ce"));
                    }
                    else if(!color){
                        g2d.setColor(Color.decode("#B58863"));
                    }
                }

                if(x == 7){
                    g2d.setColor(Color.BLACK);
                    g2d.drawString(String.valueOf(y_AxisMap.get(y)), x*(getWidth()/8)+80,  y*(getHeight()/8)+15);
                    if(color){
                        g2d.setColor(Color.decode("#f7e7ce"));
                    }
                    else if(!color){
                        g2d.setColor(Color.decode("#B58863"));
                    }
                }
                if(y == 0){
                    if(x == 0 || x == 7){
                        Image piece = Piece.ROOK.black();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 1 || x == 6){
                        Image piece = Piece.KNIGHT.black();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 2 || x == 5){
                        Image piece = Piece.BISHOP.black();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 3){
                        Image piece = Piece.QUEEN.black();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);


                    }
                    if(x == 4){
                        Image piece = Piece.KING.black();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                }
                if(y == 1){
                    Image piece = Piece.PAWN.black();
                    g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                }

                if(y == 6){
                    Image piece = Piece.PAWN.white();
                    g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                }

                if(y == 7){
                    if(x == 0 || x == 7){
                        Image piece = Piece.ROOK.white();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 1 || x == 6){
                        Image piece = Piece.KNIGHT.white();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 2 || x == 5){
                        Image piece = Piece.BISHOP.white();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 3){
                        Image piece = Piece.QUEEN.white();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                    if(x == 4){
                        Image piece = Piece.KING.white();
                        g2d.drawImage(piece, x*(getWidth()/8), y*(getWidth()/8), this);
                    }
                }
                color = !color;

            }
            color = !color;
        }

    }   
private BufferedImage pressedPiece;
private int pressedPosition;
private int pressedX;
private int pressedY;


private BufferedImage releasedPiece;
private int releasedPosition;
private int releasedX;
private int releasedY;
@Override
public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub

}
@Override
public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub
    System.out.println("Pressed");
    if(getPiece(e.getX(), e.getY()) != null){
        String[] split = getPiece(e.getX(), e.getY()).split(" ");
        if(split[0].equals("white")){
            if(split[1].equals("PAWN")) pressedPiece = Piece.PAWN.white();
            if(split[1].equals("ROOK")) pressedPiece = Piece.ROOK.white();
            if(split[1].equals("KNIGHT")) pressedPiece = Piece.KNIGHT.white();
            if(split[1].equals("BISHOP")) pressedPiece = Piece.BISHOP.white();
            if(split[1].equals("QUEEN")) pressedPiece = Piece.QUEEN.white();
            if(split[1].equals("KING")) pressedPiece = Piece.KING.white();
        }
        if(split[0].equals("black")){
            if(split[1].equals("PAWN")) pressedPiece = Piece.PAWN.black();
            if(split[1].equals("ROOK")) pressedPiece = Piece.ROOK.black();
            if(split[1].equals("KNIGHT")) pressedPiece = Piece.KNIGHT.black();
            if(split[1].equals("BISHOP")) pressedPiece = Piece.BISHOP.black();
            if(split[1].equals("QUEEN")) pressedPiece = Piece.QUEEN.black();
            if(split[1].equals("KING")) pressedPiece = Piece.KING.black();
        }
    }


    pressedX = e.getX()/(getWidth()/8);
    pressedY = e.getY()/(getWidth()/8);
    pressedPosition = getNumberPosition(pressedX, pressedY);
    setBackground(Color.decode("#cf1e15"));
    setOpaque(true);
}
@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub
    System.out.println("Released");
    if(getPiece(e.getX(), e.getY()) != null){
        String[] split = getPiece(e.getX(), e.getY()).split(" ");
        if(split[0].equals("white")){
            if(split[1].equals("PAWN")) releasedPiece = Piece.PAWN.white();
            if(split[1].equals("ROOK")) releasedPiece = Piece.ROOK.white();
            if(split[1].equals("KNIGHT")) releasedPiece = Piece.KNIGHT.white();
            if(split[1].equals("BISHOP")) releasedPiece = Piece.BISHOP.white();
            if(split[1].equals("QUEEN")) releasedPiece = Piece.QUEEN.white();
            if(split[1].equals("KING")) releasedPiece = Piece.KING.white();
        }
        if(split[0].equals("black")){
            if(split[1].equals("PAWN")) releasedPiece = Piece.PAWN.black();
            if(split[1].equals("ROOK")) releasedPiece = Piece.ROOK.black();
            if(split[1].equals("KNIGHT")) releasedPiece = Piece.KNIGHT.black();
            if(split[1].equals("BISHOP")) releasedPiece = Piece.BISHOP.black();
            if(split[1].equals("QUEEN")) releasedPiece = Piece.QUEEN.black();
            if(split[1].equals("KING")) releasedPiece = Piece.KING.black();
        }
    }

    releasedX = e.getX()/(getWidth()/8);
    releasedY = e.getY()/(getWidth()/8);
    releasedPosition = getNumberPosition(releasedX, releasedY);
    makeChanges();
}
@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub
    //System.out.println("Entered");
}
@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub
    //System.out.println("Exited");
}

private String getPiece(int x, int y){
     x = x/(getWidth()/8);
     y = y/(getWidth()/8);

    System.out.println(piecePosition.get(positions[y][x]));
    return piecePosition.get(positions[y][x]);
}
private int getNumberPosition(int x, int y){
    return positions[y][x];
}
public void makeChanges(){
    if(pressedPosition != releasedPosition){
        String pressedColor = "";
        String releasedColor = "";
        if((pressedY % 2 == 0 && pressedX % 2 == 0) || (pressedY % 2 != 0 && pressedX % 2 != 0)) pressedColor = "#f7e7ce";
        if((pressedY % 2 == 0 && pressedX % 2 != 0) || (pressedY % 2 != 0 && pressedX % 2 == 0)) pressedColor = "#B58863";

        if((releasedY % 2 == 0 && releasedX % 2 == 0) || (releasedY % 2 != 0 && releasedX % 2 != 0)) releasedColor = "#f7e7ce";
        if((releasedY % 2 == 0 && releasedX % 2 != 0) || (releasedY % 2 != 0 && releasedX % 2 == 0)) releasedColor = "#B58863";

        
        //if(!tempColor.equals("")) g2d.setColor(Color.decode(tempColor));
        //else g2d.setColor(Color.RED);
    }
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

回心转意 2025-02-17 00:25:21

为了在图形上拖动图像2D,我构建了一个工作示例。请注意,PaintComponent()方法只是绘制组件的当前状态。

状态根据用户输入更改事件。每当发生这种情况时,请致电RepAlt(),以便UI知道该组件应重新绘制。但这是决定是否/何时调用paintComponent()的秋千框架。

package com.mycompany.test;

import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageDragPanel extends JPanel {
    
    // load image from classpath
    // private final javax.swing.ImageIcon image = new javax.swing.ImageIcon(getClass().getResource("/public_FILL0_wght400_GRAD0_opsz48.png"));

    // load image from external URL
    private final javax.swing.ImageIcon image = new javax.swing.ImageIcon(new URL(https://i.sstatic.net/memI0.png));
    private Rectangle pos;
    private Point dragStart = null;

    public ImageDragPanel() {
        pos = new Rectangle(0, 0, image.getIconWidth(), image.getIconHeight());
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if (pos.contains(e.getPoint())) {
                    dragStart = e.getPoint();
                    e.consume();
                    setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
                }
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                if (dragStart != null) {
                    dragStart = null;
                    e.consume();
                    setCursor(Cursor.getDefaultCursor());
                }
            }

        });
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (dragStart != null) {
                    Point origin = new Point(
                            e.getPoint().x - (int)pos.getWidth()/2, 
                            e.getPoint().y - (int)pos.getHeight()/2
                    );                    
                    pos.setLocation(origin);
                    repaint();
                }
            }
    });
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        
        g2d.drawImage(image.getImage(), pos.x, pos.y, null);
    }
    
    public static void main(String[] args) {
        JFrame f = new JFrame();
        ImageDragPanel idp = new ImageDragPanel();
        Dimension d = new Dimension(400, 400);
        idp.setMinimumSize(d);
        idp.setPreferredSize(d);
        f.add(idp);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setLocationRelativeTo(null);
        f.show();
    }
}

因此,这将确保平稳的拖动操作。看来您的电网目标位置有限。因此,掉落后(或按钮释放)只需确定鼠标指针所在的哪个瓷砖并计算新位置 - 无论是在屏幕坐标还是在网格中,然后重新绘制。

For dragging an image over the Graphics2D I constructed a working example. Note that the paintComponent() method just paints the current state of the component.

The state changes event based on user input. Whenever that happens, call repaint() so the UI knows this component should be redrawn. But it is the Swing framework to decide whether/when to call paintComponent().

package com.mycompany.test;

import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageDragPanel extends JPanel {
    
    // load image from classpath
    // private final javax.swing.ImageIcon image = new javax.swing.ImageIcon(getClass().getResource("/public_FILL0_wght400_GRAD0_opsz48.png"));

    // load image from external URL
    private final javax.swing.ImageIcon image = new javax.swing.ImageIcon(new URL(https://i.sstatic.net/memI0.png));
    private Rectangle pos;
    private Point dragStart = null;

    public ImageDragPanel() {
        pos = new Rectangle(0, 0, image.getIconWidth(), image.getIconHeight());
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if (pos.contains(e.getPoint())) {
                    dragStart = e.getPoint();
                    e.consume();
                    setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
                }
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                if (dragStart != null) {
                    dragStart = null;
                    e.consume();
                    setCursor(Cursor.getDefaultCursor());
                }
            }

        });
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (dragStart != null) {
                    Point origin = new Point(
                            e.getPoint().x - (int)pos.getWidth()/2, 
                            e.getPoint().y - (int)pos.getHeight()/2
                    );                    
                    pos.setLocation(origin);
                    repaint();
                }
            }
    });
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        
        g2d.drawImage(image.getImage(), pos.x, pos.y, null);
    }
    
    public static void main(String[] args) {
        JFrame f = new JFrame();
        ImageDragPanel idp = new ImageDragPanel();
        Dimension d = new Dimension(400, 400);
        idp.setMinimumSize(d);
        idp.setPreferredSize(d);
        f.add(idp);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setLocationRelativeTo(null);
        f.show();
    }
}

So this will guarantee a smooth dragging operation. As it seems you have a grid with limited target positions. So upon drop (or button release) just decide which tile the mouse pointer is on and calculate the new location - be it in screen coordinates or in your grid, then redraw.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文