[英]How to add a JPanel to JFrame without deleting currently drawn graphics?
我正在使用 java gui(揮桿,awt)制作一個基本的國際象棋游戲。 我發現雖然 1,只有在 JFrame 中繪制的板最初顯示,而 2,當我開始拖動我的 cursor 時出現一塊圖像,板消失並只留下可拖動的圖像。 如何使圖像最初可見並且在拖動時不移除板?
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Color;
public class BoardGUI extends JFrame {
public BoardGUI()
{
this.setSize(1000,1000);
this.setTitle("Chess");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PieceImage king = new PieceImage("./king.png",500,800);
this.add(king);
this.setVisible(true);
}
public void paint(Graphics g)
{
int[] swap = {1,2};
String[] rowNum = {"8","7","6","5","4","3","2","1"};
String[] ColumnLetter = {"A","B","C","D","E","F","G","H"};
int rowCount = 0;
int columnCount = 0;
for(int i=100;i<900;i+=100)
{
for(int j=100;j<900;j+=100)
{
if(i==100)
{
g.setColor(Color.black);
g.drawString(rowNum[rowCount++],i-20,j+60);
}
if(j==100)
{
g.setColor(Color.black);
g.drawString(ColumnLetter[columnCount++],i+50,j+820);
}
if(swap[0] == 1)
g.setColor(Color.white);
else
g.setColor(Color.black);
swapColor(swap);
g.fillRect(i,j,100,100);
if(j==800)
swapColor(swap);
}
}
}
private void swapColor(int[] swap)
{
int temp = swap[0];
swap[0] = swap[1];
swap[1] = temp;
}
}
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Graphics;
import java.awt.Point;
public class PieceImage extends JPanel {
private ImageIcon image;
private Point prevPos;
private Point pos;
public PieceImage(String imagePath, int xPos, int yPos)
{
if(imagePath==null)
return;
this.image = new ImageIcon(imagePath);
this.pos = new Point(xPos,yPos);
ClickListener clickListner = new ClickListener();
DragListener dragListener = new DragListener();
this.addMouseListener(clickListner);
this.addMouseMotionListener(dragListener);
}
private class ClickListener extends MouseAdapter {
public void mousePressed(MouseEvent e)
{
prevPos = e.getPoint();
}
}
private class DragListener extends MouseInputAdapter {
public void mouseDragged(MouseEvent e)
{
Point temp = e.getPoint();
pos.translate((int)(temp.getX() - prevPos.getX())-50, (int)(temp.getY() - prevPos.getY())-50);
prevPos = pos;
repaint();
}
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
image.paintIcon(this, g, (int)pos.getX(), (int)pos.getY());
}
}
您不應覆蓋 JFrame 的 paint() 方法。
JFrame 是您的頂級容器,它應該包含組件,可以根據需要進行繪制。 因此,您應該使用 go 來獲得更好的方法,而不是覆蓋 paint() 方法。 我會給你一些建議,讓你在 Swing 中創建一個國際象棋游戲:
我個人從不使用 JFrame 本身,我通常在里面放置一個 JPanel 來填充整個 JFrame。
您可以使用此 JPanel 並將其布局設置為 JPanel.setLayout(new GridLayout(8, 8))。 這將為您提供一個完整且響應迅速的國際象棋領域,可以填充您想要的任何組件。
利用 BorderLayout 將 position 字母和數字放置在頂部 (NORTH)、左側 (WEST) 或您想要的任何位置。
要實現基於拖放的游戲,一個簡單的方法是在 GridLayout 中放置 64 個 JButton 並添加 MouseListener + MouseMotionListener。 mousePressed() 和 mouseReleased() 方法將有助於實際激活/停用 DnD,方法 mouseDragged() 可用於將圖標固定在鼠標上。
我希望這可以幫助您創建國際象棋游戲,祝您好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.