用户单击它之后,如何在Graphics2D上移动图像
我实现了mouselistener
和Mousepressed
,我得到了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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
为了在图形上拖动图像2D,我构建了一个工作示例。请注意,PaintComponent()方法只是绘制组件的当前状态。
状态根据用户输入更改事件。每当发生这种情况时,请致电RepAlt(),以便UI知道该组件应重新绘制。但这是决定是否/何时调用paintComponent()的秋千框架。
因此,这将确保平稳的拖动操作。看来您的电网目标位置有限。因此,掉落后(或按钮释放)只需确定鼠标指针所在的哪个瓷砖并计算新位置 - 无论是在屏幕坐标还是在网格中,然后重新绘制。
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().
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.