Java 绘制和重新绘制以及JFrame/JPanel创建

Java 绘制和重新绘制以及JFrame/JPanel创建,java,image,swing,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;

在我开始了解这一点之前:我对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();

}

}
import javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.ImageIcon;
导入java.util.Random;
导入java.awt.*;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
公共类游戏扩展画布{
私有静态整数高度=300,宽度=600;//25x50
专用随机生成器=新随机();
私有字符串[][]TerrainList=新字符串[12][12];
public void GameSetup(){
JFrame容器=新JFrame(“CARSSémon”);
//获取帧的内容并设置游戏的分辨率
JPanel面板=(JPanel)container.getContentPane();
面板。设置首选尺寸(新尺寸(宽度、高度));
//panel.setLayout(空);
//立根(0,0800600);;
//小组。添加(本);
//最后使窗口可见
container.pack();
容器。可设置大小(false);
container.setVisible(true);
container.setLocationRelativeTo(null);//中心屏幕
container.addWindowListener(新的WindowAdapter(){
公共无效窗口关闭(WindowEvent e){
系统出口(0);
}
});
准备训练();
PreparePlayer();
}
公众假期{

对于(int a=0;a不要重新发明轮子。使用a和an为您绘制图像。只需将其添加到a
JPanel
即可

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

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

  • 创建游戏区域所需大小的
    buffereImage
  • 为可能需要绘制的每个较小图标(字符、地形中的元素等)获取
    Image
    实例,并将它们绘制到主
    BufferedImage
    1的
    Graphics
    实例中
  • 要显示主“游戏”图像,有两个很好的选项:
  • 将主图像添加到
    JLabel
    并将其添加到
    JPanel
    ,调用
    label.repaint()
  • 将游戏图像直接绘制到提供给
    JComponent
    paintComponent()
    方法的
    Graphics
    实例
关于最后一部分,我建议选择1

1.例如。 处理
缓冲区图像
图形
  • 非常简单的示例。
  • 更复杂的例子。
  • 显示的是略微不同的定位(扩展
    JLabel
    )。

  • 标签是输出50x25个图像的最有效方式吗?我如何处理这样的数量?你能链接一些东西让我开始吗?(对不起,我应该在我的原始帖子中提到这一点。)@Pyropylon。非常感谢Jeffrey,我现在正在检查标签。对我的工作质量非常抱歉。这应该会有很大帮助。再次感谢。建议:你不想将AWT与Swing混用,所以请扔掉所有的“画布”-相关代码。切勿使用paint或paintComponent方法从中打开文件。这会不必要地降低方法的速度,并使程序响应速度大大降低。不要使用paint方法,而是使用JComponent或其子对象(如JPanel)的
    paintComponent(…)
    方法。更简单的方法是将图像放入ImageIcon中,并将图标放入JLabel中,如下所述。最重要的是,您需要阅读与图形相关的教程。这些教程将非常有用。非常感谢,对于我的代码质量,我感到非常抱歉。我仍在学习,但我意识到这不是借口。因此我应该确定使用JLabels输出25x50网格的图像?我不是在听,只是尽管我100%肯定,但看起来我并没有花太多时间来这里。我只是想确保使用JLabels对许多图像进行正确的处理。如果你的25x50网格的图像包含许多相同的图像,那么是的,我会选择w使用ImageIcons。您可以将一个ImageIcon添加到多个JLabel中,这样您可能只需要处理几个图像/ImageIcons。只有大约5个大小相同的不同图像,因此您的方法看起来非常有前途。再次感谢气垫船,这真的帮了我大忙。我最初计划输出一个25x50网格的图标整个游戏区域总共只有大约5个不同的图标。你创建BuffereImage和绘制它的方法似乎更灵活,并且在将来提供了一种更容易实现更多功能的方法,但我不认为我完全理解。你能给我链接一个关于绘制和使用BuffereImage的好来源吗?非常感谢!这应该有助于我更好地掌握BuffereImage。安德鲁,你是个救命恩人。很高兴你找到了一个策略。:)
    public void gameRenderLoop() {
        Graphics2D g2 = gameImage.createGraphics();
        g2.drawImage(playerImage, 22, 35, this);
        ...
        g2.dispose();
    }