如何将我的Jlabel更改为png。使用 getImage 获取图片

问题描述 投票:0回答:1

这里是 Java Swing 的初学者(可能也是一般的 Java)。我正在编辑一个 Java 贪吃蛇游戏,其中已经放入了一堆代码。我想制作 Jlabel 按钮,在主菜单状态下,存在一个播放按钮图像。我已经做的是在“标签”处为图像创建一个占位符,其中我使用了 setBounds、setBackground 颜色红色、添加了鼠标侦听器等:

public MyFrame()
    {

        
        //set the button exist if it's menu state
        if(State == STATE.MENU) {
            this.setLayout(null);
            this.setVisible(true);
            label = new JLabel();
            label.setBounds(350, 100, 200, 100);
            label.setBackground(Color.red);
            label.setOpaque(true);
            label.addMouseListener(this);
            this.add(label);
            this.setVisible(true);

}

有一个类,我的图像文件被放入数组中(示例):

public class ImageUtil
{
    public static Map<String, Image> images = new HashMap<>();

    static
    {

        images.put("0", GameUtil.getImage("kiwi.png"));
        images.put("1", GameUtil.getImage("lemon.png"));
        images.put("2", GameUtil.getImage("litchi.png"));

...

等等。

我观看了使用 MouseListener 的教程,并尝试使用 setIcon 方法。我的想法是首先:

  1. 在 MyFrame() 之前从 ImageUtil 类中的数组初始化我的图像按钮:
    public Image PLAYBUTTON = ImageUtil.images.get("playbutton");
  2. 演练视频,从那时起我将标签代码占位符替换为使用 setIcon:
    label = new JLabel();
            label.addMouseListener(this);
            PLAYBUTTON = new ImageIcon("PLAYBUTTON.png").getImage();
            label.setIcon((Icon) PLAYBUTTON);
            label.setOpaque(true);
            this.add(label);
...
  1. 当我尝试在主类上启动游戏后,出现错误:
    Exception in thread "main" java.lang.ClassCastException: class sun.awt.image.ToolkitImage cannot be cast to class javax.swing.Icon (sun.awt.image.ToolkitImage and javax.swing.Icon are in module java.desktop of loader 'bootstrap')

不太明白发生了什么,但我将代码恢复到使用按钮占位符时的状态。

我的直觉是问题可能会发生,因为我只能在游戏运行时的绘制或绘制过程中在运行时使用 ImageUtil 类中的图像,而不是使用 setIcon。例如,在我的 Main.java 类中,有效的代码是:

...
public Image fail = ImageUtil.images.get("game-scene-01");
...
public void paint(Graphics g)
    {

        super.paint(g);
        /*g.drawImage(background, 0, 0, null);*/

        // Ákveða stöðu leiksins.
        if(State == STATE.GAME) {

            if (mySnake.l) {
                mySnake.draw(g);
                if (food.l) {
                    food.draw(g);
                    food.eaten(mySnake);
                } else {
                    food = new Food();
                }
            } else {
                **g.drawImage**(fail, 0, 0, null);
}

蛇死后,游戏成功,显示我失败的画面。

我目前缺乏关于Java游戏中运行时的知识(在代码运行和游戏循环开始之后,我不确定java仍然读取哪些代码以及java读取一次哪些代码)。尽管我之前没有制作游戏的经验,但我还是尽力理解了代码。

java swing
1个回答
0
投票

您想从 JLabel 获取图片吗?实际上,您可以从任何 JComponent 执行此操作。

当您调用方法 paint(Graphics) 时,每个 JComponent 都会渲染自身。您所需要的只是有一个合适的 Graphics 实例。 您可以运行 createGraphics() 从 BufferedImage 中获取一个。

所以顺序是:

JLabel l = new JLabel(...);
BufferedImage bi = new BufferedImage(800, 600, BufferedImage.TYPE_4BYTE_ABGR);
l.paint(bi.createGraphics());

File outputfile = new File("saved.png");
ImageIO.write(bi, "png", outputfile);
© www.soinside.com 2019 - 2024. All rights reserved.