我目前正在做一个制作Connect 4的项目,我的坐标系遇到了一些问题。我有一个 800x600px 的 png 图像,它显示了"板",它由一个 8x6 的网格组成,每个位置都是一个 100x100px 的正方形......至少在 GIMP2 和文件系统中是这样。但是,当我使用Graphics2D的drawImage()方法将图像绘制到800x600 JFrame上时,它会从底部粘下来。我是否需要考虑 JFrame 的边界和这个系统中的东西,还是我错过了其他东西?
谢谢!
附言这是执行绘图的 JPanel 类。
public class GameBoard extends JPanel {
public GameBoard() {
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
//Write messages
if (!(GameManager.getInstance().getMessage() == null)) {
g2d.drawString(GameManager.getInstance().getMessage(), 400, 25);
}
//Draw board graphic
ImageIcon bg = new ImageIcon("res/board.png");
g2d.drawImage(bg.getImage(), 0, 0, 800, 600, this);
//Draw counters
for (int columns = 0; columns < 8; columns++) {
for (int rows = 0; rows < 6; rows++) {
if (!(GameManager.getInstance().getState(columns, rows) == null)) {
Counter cTemp = GameManager.getInstance().getState(columns, rows);
g2d.drawImage(cTemp.getImage(), cTemp.getX(), cTemp.getY(), 100, 100, this);
}
}
}
}
}
-
覆盖
paintComponent
而不是paint
并调用super.paintComponent(g)
@Override protected void paintComponent(Graphics g) { super.paintComponent(g); ... }
-
覆盖
JPanel
的getPreferredSize()
@Override public Dimension getPreferredSize() { return new Dimension(800, 600); }
-
不要在
paintComponent
方法中创建映像。在构造函数中执行此操作。public class GameBoard extends JPanel { ImageIcon img; public GameBoard() { img = new ImageIcon(...); }
-
pack()
您的框架,请不要setSize()
,并且将尊重JPanel
的首选大小(通过您的覆盖getPreferredSize()
)。 -
您可以在覆盖后只使用
getWidth()
和getHeight()
getPreferredSize()
drawImage(bg.getImage(), 0, 0, getWidth(), getHeight(), this);
处理所有这些事情,如果它没有帮助,发布一个我们可以测试的可运行示例。