java - 绘制和重绘以及 JFrame/JPanel 创建

标签 java image swing jframe jpanel

在我开始之前要知道:我对 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(); 方法吗?代码非常困惑,但我认为最好包含所有代码。

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

最佳答案

I just read a huge section of Java text on graphics but could only find information on loading images, not displaying through paint.

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

  • 创建游戏区域所需大小的 BufferedImage
  • 为您可能需要绘制的每个较小图标(字符、地形中的元素等)获取 Image 实例,并将它们绘制到 Graphics 实例主要的BufferedImage1
  • 要显示主要的“游戏”图像,有两个不错的选择:
    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. 稍微不同的方法(扩展JLabel)显示image painting with transparency .

关于java - 绘制和重绘以及 JFrame/JPanel 创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10004227/

相关文章:

java - 如何在 Android 中重试上传到服务器

html - 在保持比例的情况下在 html 中生成 "thumbnail"

jquery - 通过上下滚动控制图像的淡入淡出

html - 增加一个div的大小

java - JScrollPane 中的 JTable 在 Mac OS X 中无法正确显示

java - 在java中打印2页jframe

java - jvisualvm - 如何为我的程序提供调用类之外的图标和另一个名称?

java - Hibernate 集合中的并发修改

java - 使用方面记录域对象(编译时编织)

java - 防止 JTable 单元格编辑器在验证失败时留下 "edit mode"