如何保存JPanel的特定部分?

时间:2017-04-25 11:10:28

标签: java jpanel chess

我正在进行国际象棋比赛,我想让玩家选择棋盘的颜色。因此我将使用这种方法:

    static void createBoard(Graphics g) {

    Color bright = new Color(255, 225, 181);    //player chooses color
    Color dark = new Color(188, 141, 105);      //player chooses color
    boolean darkTile = false;

    for (int y = spaceY; y < (spaceY + BOARDHEIGHT); y += TILESIZE) {
        for (int x = spaceX; x < (spaceX + BOARDWIDTH); x += TILESIZE) {
            if (darkTile) {
                g.setColor(dark);
            } else {
                g.setColor(bright);
            }
            g.fillRect(x, y, TILESIZE, TILESIZE);
            darkTile = !darkTile;
        }
        darkTile = !darkTile;
    }
    BufferedImage overlay;
    try {
        overlay = ImageIO.read(new File("overlay.png"));
        JLabel label = new JLabel(new ImageIcon(overlay));
        g.drawImage(overlay, spaceX, spaceY, BOARDWIDTH, BOARDHEIGHT, null);
    } catch (IOException e) {}
}

这个我想保存为BufferedImage,所以我不必一直运行这个方法。

那么如何在没有国际象棋棋盘之外的东西的情况下保存我的JPanel的这一部分呢? (会有更多画)

2 个答案:

答案 0 :(得分:2)

  

我想保存为BufferedImage,

不知道您需要将BufferedImage保存到文件中。您可以在应用程序启动时创建应用程序使用的BufferedImage。然后,如果任何用户颜色发生变化,您可以重新创建BufferedImage。

您可以直接绘制到BufferedImage:

BufferedImage image = new BufferedImage(boardSize, boardSize, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();

// draw the squares onto board

g2d.dispose();

现在你的createBoard()方法应该返回BufferedImage,以便你的应用程序可以使用它。

答案 1 :(得分:1)

你付出了一些努力来提出你的问题,所以让我们通过一些想法来表达你的想法。

首先:你有一个空的catch块{}。这是不好的做法。这只会消除您收到的任何错误消息。这没有用。允许该异常冒泡并停止您的应用程序;或至少打印其内容 - 以便您了解会发生什么。

鉴于您的评论:如果出现错误,您现在永远不会。特别是在做IO时,各种各样的事情都可能出错。请相信我:捕获块糟糕练习;你不应该训练自己接受它们。

第二个想法:不要那样做。听起来很方便;但保存背景图片并没有增加太多价值。

您无需担心此代码;当您的应用程序出现时,它会执行一次。

所以,真正的答案是:关注你想要实现的功能;并且不要因pre-mature optimizations而分心​​。