这里是 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 方法。我的想法是首先:
public Image PLAYBUTTON = ImageUtil.images.get("playbutton");
label = new JLabel();
label.addMouseListener(this);
PLAYBUTTON = new ImageIcon("PLAYBUTTON.png").getImage();
label.setIcon((Icon) PLAYBUTTON);
label.setOpaque(true);
this.add(label);
...
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读取一次哪些代码)。尽管我之前没有制作游戏的经验,但我还是尽力理解了代码。
您想从 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);