【问题标题】:Paint and repaint and JFrame/JPanel creation绘制和重绘以及创建 JFrame/JPanel
【发布时间】:2012-04-17 18:06:06
【问题描述】:

在我开始之前知道这一点:我对 Java 和编程非常陌生。如何正确地将“grass.jpg”绘制到屏幕上?

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.ImageIcon;
import java.util.Random;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Game extends Canvas {
private static int Height = 300, Width = 600;  //25x50
private Random generator = new Random();

private String[][] TerrainList = new String[12][12];



public void GameSetup() {
    JFrame container = new JFrame("CARSSémon");

// get hold the content of the frame and set up the resolution of the game
JPanel panel = (JPanel) container.getContentPane();
panel.setPreferredSize(new Dimension(Width,Height));
//panel.setLayout(null);

    //setBounds(0,0,800,600);
//panel.add(this);

// finally make the window visible
container.pack();
container.setResizable(false);
container.setVisible(true);
    container.setLocationRelativeTo(null);  //Centers screen

    container.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
    });


    PrepareTerrain();
    PreparePlayer();

}

public void PrepareTerrain() {

  for (int a=0; a<=11; a++){
   for (int b=0; b<=11; b++){
      TerrainList[a][b]="grass";   //Sets defult terrain of grass
   }
  }

  int BushLocationx = generator.nextInt(12);
  int BushLocationy = generator.nextInt(12);

  BushCheck(BushLocationx,BushLocationy);  //Checks to see if it can make bushs at the location

}

@Override
public void paint(Graphics g) {
super.paint(g);
// Draw an Image object
Image grass = new ImageIcon("grass.jpg").getImage();
Image bushes = Toolkit.getDefaultToolkit().getImage("bushes.jpg");
g.setColor(Color.BLACK);
g.drawImage(grass, 0, 0, null);
g.drawImage(grass, 0, 50, null);
g.drawImage(grass, 50, 0, null);
g.drawImage(grass, 200, 200, null);
}

public void DrawTerrain() {

  for (int r=0; r<=11; r++){
   for (int c=0; c<=11; c++){

   }
  }
}

private void BushCheck(int x, int y){

}

public void PreparePlayer() {

}

public static void main(String[] args) {

    Game G =new Game();
    G.GameSetup();

}

}

现在我显然意识到这个程序基本上没有实现,但我想如果我什至不能显示任何图片,那么开始实现的意义何在?

我的问题是我无法弄清楚为什么不显示 .jpg。在创建JFrameJPanel 时不应该调用paint(); 方法吗?代码很乱,但我认为最好包含所有代码。

如果这很重要,这最终将成为一款类似于 Pokemon 的游戏,其中运行窗口由许多 16x16 像素的正方形组成,玩家可以在上面移动。在开始之前,我想尝试在随机位置输出一些图像。我一直在阅读类似的问题并查看示例,我刚刚阅读了一段关于图形的 Java 文本,但只能找到有关加载图像的信息,而不是通过绘画显示的信息。如果有人可以通过正确的方式指出我,将不胜感激。 (我意识到我很可能完全需要重新启动,并且正在做完全错误的事情,但你可以做的任何事情都会有所帮助。)

【问题讨论】:

  • 建议:您不想将 AWT 与 Swing 混合使用,因此摆脱所有与“Canvas”相关的代码。 从不使用paint或paintComponent方法打开文件。它不必要地减慢了方法的速度,并使您的程序响应速度大大降低。不要在绘制方法中绘制,而是在 JComponent 或其子之一(例如 JPanel)的 paintComponent(...) 方法中绘制。更简单的方法是将 Image 放入 ImageIcon 并将图标放入 JLabel 中,如下所示。最重要的是——您需要阅读与 graphis 相关的教程。他们将提供极大的帮助。
  • 非常感谢,对我的代码质量感到非常抱歉。我还在学习,但我意识到这不是借口。所以我绝对应该使用 JLabels 来输出 25x50 的图像网格?不是我在听,只是虽然我 100% 肯定,但看起来我并没有花很多时间来这里。我只是想确保我在使用 JLabels 处理许多图像时朝着正确的方向前进。
  • 如果您的 25x50 图像网格包含许多相同的图像,那么我会选择 ImageIcons。您可以将一个 ImageIcon 添加到多个 JLabel 中,因此您可能只需要处理几个图像/ImageIcon。
  • 只有大约 5 个大小相同的不同图像,所以看起来你的方法很有前途。再次感谢气垫船,这真的帮助了我。

标签: java image swing jframe jpanel


【解决方案1】:

我刚刚阅读了大量关于图形的 Java 文本,但只能找到有关加载图像的信息,而不是通过绘图显示的信息。

对于口袋妖怪风格的游戏,我认为为每个图标/图像使用JLabel 不会带来任何好处。而是:

  • 创建游戏区域所需大小的BufferedImage
  • 为您可能需要绘制的每个较小图标(字符、地形中的元素等)获取Image 实例并将它们绘制到主BufferedImageGraphics 实例1。
  • 要显示主“游戏”图像,有两个不错的选择:
    1. 将主图像添加到JLabel 并将其添加到JPanel,调用label.repaint()
    2. 将游戏图像直接绘制到提供给JComponentpaintComponent() 方法的Graphics 实例。

对于最后一部分,我推荐选项 1。

1。例如

public void gameRenderLoop() {
    Graphics2D g2 = gameImage.createGraphics();
    g2.drawImage(playerImage, 22, 35, this);
    ...
    g2.dispose();
}

处理BufferedImage & Graphics的例子

  1. painting an image 的非常简单的例子。
  2. 更复杂的例子dealing with text & clips.
  3. 显示image painting with transparency 的略有不同的大头钉(扩展JLabel)。

【讨论】:

  • 我最初计划输出一个 25x50 的图标网格,整个游戏区域中总共只有大约 5 个不同的图标。您创建 BufferedImage 并对其进行绘画的方法似乎更灵活,并且将来会提供一种更简单的方法来实现更多功能,但我认为我并不完全理解。您能否为我提供一个关于绘画和使用 BufferedImage 的良好资源?
  • 非常感谢!这应该有助于我很好地掌握 BufferedImage。你是一个救生员安德鲁。
  • 很高兴您已整理好策略。 :)
【解决方案2】:

不要重新发明轮子。使用JLabelImageIcon 为您绘制图像。只需将其添加到 JPanel 即可。

【讨论】:

  • 标签是输出 50x25 图像的最有效方式吗?我将如何处理这样的数量?你能链接一些东西让我开始吗? (对不起,我应该在我的原始帖子中提到这一点。)
  • @Pyropylon Label tutorial.
  • 非常感谢 Jeffrey,我现在要检查标签。真的很抱歉我的工作质量。这应该会有所帮助。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多