Graphics2D DrawImage不代表图像大小

时间:2014-02-23 17:31:43

标签: java swing graphics 2d paint

我目前正在开发一个用于制作Connect 4的项目,我遇到了一些坐标系问题。我有一个800x600px png图像,显示'板',它由一个8x6网格组成,每个位置是一个100x100px的方形...至少在GIMP2和文件系统中是这样的。然而,当我使用Graphics2D的drawImage()方法将图像绘制到800x600 JFrame上时,它会从底部伸出。我是否需要在此系统中考虑JFrame的边框和内容,或者我错过了其他内容?

谢谢!

P.S。这是执行绘图的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);
            }                   
        }
    }       
}

}

1 个答案:

答案 0 :(得分:3)

  1. 覆盖paintComponent而不是paint并致电super.paintComponent(g)

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        ...
    }
    
  2. 覆盖getPreferredSize()

    JPanel
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(800, 600);
    }
    
  3. 不要paintComponent方法中创建图片。在构造函数中执行。

    public class GameBoard extends JPanel { 
        ImageIcon img;
        public GameBoard() {
            img = new ImageIcon(...);
        }
    
  4. pack()您的框架, setSize()JPanel的首选尺寸将得到尊重(通过您的覆盖{{ 1}})。

  5. 您可以在覆盖getPreferredSize()后使用getWidth()getHeight()

    getPreferredSize()
  6. 处理所有这些事情,如果没有帮助,请发布一个我们可以测试的可运行示例。