在开关中添加图像 - PaintComponent覆盖

时间:2017-12-07 18:37:14

标签: java image swing switch-statement paintcomponent

我试图在我正在制作的游戏中添加一个小burger.jpg img。只要在Switch中传递'f'(食物),就应该添加汉堡。我在我的代码中实现这个问题。

我原本只填充橙色矩形g2.fillRect(),但我想用实际图像替换它。我已经尝试缩放图像并添加它但它没有显示出来。如果我在for循环结束时替换g2.fillRect,它会使每个方格成为汉堡,而不仅仅是'f'

我该怎么做?

private class Game extends JPanel {

    BufferedImage img = null;

    @Override
    public void paintComponent(Graphics g2) {

        super.paintComponent(g2);

        try {

            img = ImageIO.read(new File("src/burger.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        BufferedImage otherImage = new BufferedImage(50, 50,
                BufferedImage.TYPE_INT_RGB);
        Graphics g = otherImage.createGraphics();

        int width = getWidth() / game.getBoardWidth();
        int height = getHeight() / game.getBoardHeight();

        char[] symbols = game.toString().toCharArray();

        int x = 0;
        int y = 0;

        for (char c : symbols) {

            switch (c) {
            case 'Q':
                g2.setColor(Color.BLACK);
                break;
            case 'H':
                g2.setColor(Color.GREEN);
                break;
            case 'f':
                //g2.setColor(Color.ORANGE);
                g2.drawImage(img, x, y, width, height, null);
                break;
            case '-':
                g2.setColor(Color.WHITE);
                break;
            case '\n':
                y += height;
                x = 0; 
            }

           //g2.drawImage(img, x, y, width, height, null);
           g2.fillRect(x, y, width, height);
            x += width;
        }
    }

}

1 个答案:

答案 0 :(得分:3)

尚未测试,但现在正在您的计划中发生这种情况:

  1. 获取符号
    • if('f')然后drawImage然后fillRect
  2. 你想要的是:

    1. 获取符号
      • if('f'),然后drawImage,否则fillRect
    2. 所以你比较一下:

      if (symbol == 'f') {
          g2.drawImage(img, x, y, width, height, null);
      } else {
          g2.fillRect(x, y, width, height);
      }
      

      或者我要做的是:

      switch (c) {
          case 'Q':
              g2.setColor(Color.BLACK);
              g2.fillRect(x, y, width, height);
              break;
          case 'H':
              g2.setColor(Color.GREEN);
              g2.fillRect(x, y, width, height);
              break;
          case 'f':
              //g2.setColor(Color.ORANGE);
              g2.drawImage(img, x, y, width, height, null);
              break;
          case '-':
              g2.setColor(Color.WHITE);
              g2.fillRect(x, y, width, height);
              break;
          case '\n':
              y += height;
              x = 0; 
      }
      

      注释掉或删除最后一次致电:

      g2.fillRect(x, y, width, height);
      

      TIP:

      try {
          img = ImageIO.read(new File("src/burger.jpg"));
      } catch (IOException e) {
          e.printStackTrace();
      }
      

      这些行应该在构造函数中,而不是在paintComponent方法中,它会被Swing多次调用,这样做可能会减慢或阻止/冻结应用程序,直到它完成读取。

      另外,您没有使用otherImage变量,因此您也可以将其删除...