【问题标题】:How to use KeyListener to paint different images?如何使用 KeyListener 绘制不同的图像?
【发布时间】:2016-01-27 09:56:42
【问题描述】:

这只是我的 JFrame 文件。我想在我的角色向下移动时绘制 down.png,在我的角色向上移动时绘制 up.png 等等。我已经浏览了一段时间,但我找不到解决我的问题的方法。如果有人可以将我链接到答案或提供答案,那就太好了!

这是我的代码:

package Michael;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class MyCanvas extends Canvas implements KeyListener
{
int myX = 100;
int myY = 100;

BufferedImage down;
{
    try
    {
        down = ImageIO.read(new File("Images/down.png"));
    }

    catch (IOException e)
    {
        System.out.println("Cannot find image file.");
    }
}

BufferedImage downrun;
{
    try
    {
        downrun = ImageIO.read(new File("Images/downrun.png"));
    }

    catch (IOException e)
    {
        System.out.println("Cannot find image file.");
    }
}

BufferedImage left;
{
    try
    {
        left = ImageIO.read(new File("Images/left.png"));
    }

    catch (IOException e)
    {
        System.out.println("Cannot find image file.");
    }
}

BufferedImage right;
{
    try
    {
        right = ImageIO.read(new File("Images/right.png"));
    }

    catch (IOException e)
    {
        System.out.println("Cannot find image file.");
    }
}

BufferedImage runleft;
{
    try
    {
        runleft = ImageIO.read(new File("Images/runleft.png"));
    }

    catch (IOException e)
    {
        System.out.println("Cannot find image file.");
    }
}

BufferedImage runright;
{
    try
    {
        runright = ImageIO.read(new File("Images/runright.png"));
    }

    catch (IOException e)
    {
        System.out.println("Cannot find image file.");
    }
}

BufferedImage swoosh;
{
    try
    {
        swoosh = ImageIO.read(new File("Images/swoosh.png"));
    }

    catch (IOException e)
    {
        System.out.println("Cannot find image file.");
    }
}

BufferedImage swordraise;
{
    try
    {
        swordraise = ImageIO.read(new File("Images/swordraise.png"));
    }

    catch (IOException e)
    {
        System.out.println("Cannot find image file.");
    }
}

BufferedImage up;
{
    try
    {
        up = ImageIO.read(new File("Images/up.png"));
    }

    catch (IOException e)
    {
        System.out.println("Cannot find image file.");
    }
}

BufferedImage uprun;
{
    try
    {
        left = ImageIO.read(new File("Images/uprun.png"));
    }

    catch (IOException e)
    {
        System.out.println("Cannot find image file.");
    }
}

public MyCanvas() // The MyCanvas constructor.
{
    this.setSize(600, 400);
    this.addKeyListener(this);
    this.setBackground(Color.WHITE);
    this.setFocusable(true);
}

public void paint(Graphics g)
{
    g.drawImage(down, myX, myY, 55, 55, null);
    g.drawImage(left, myX, myY, 55, 55, null);
    g.drawImage(right, myX, myY, 55, 55, null);
    g.drawImage(up, myX, myY, 55, 55, null);
} // I don't want to draw every image at the same time, I only want to draw 'up', when the charcter is moving up, etc.

public void moveIt(KeyEvent e)
{
    switch(e.getKeyCode())
    {
        case KeyEvent.VK_DOWN:
            myY += 10;
            break;
        case KeyEvent.VK_UP:
            myY -= 10;
            break;
        case KeyEvent.VK_LEFT:
            myX -= 10;
            break;
        case KeyEvent.VK_RIGHT:
            myX += 10;
            break;
        case KeyEvent.VK_SHIFT:

    }

    repaint();
}

@Override
public void keyPressed(KeyEvent e)
{
    moveIt(e);
}

@Override
public void keyTyped(KeyEvent e)
{
    // TODO Auto-generated method stub
}

@Override
public void keyReleased(KeyEvent e)
{
    // TODO Auto-generated method stub
}
}

非常感谢!

【问题讨论】:

  • 第一个答案是不要,使用 JPanel 和键绑定 API,例如 this 之类的东西
  • @MadProgrammer 你确定除了 JPanel 没有别的办法吗?当然有一种方法可以用 JFrame 来做到这一点。我的课程还没有进入 JPanel 和你在那个例子中的一半。
  • 有很多方法,所有方法都充满了 Key Bindings API 旨在解决的问题。 java.awt.Canvas 来自一个 15 年前被 Swing (JPanel) API 取代的 API,也许你应该让你的导师知道他们正在处理一个在一般实践中不再使用的 API
  • @MadProgrammer 好的,我会告诉他的。谢谢!

标签: java swing graphics keylistener


【解决方案1】:

查看Motion Using the Keyboard 中的Motion With Key Bindings 示例。这个例子展示了如何使用Key Bindings(这是更好的解决方案)而不是 KeyListener 来制作动画。

首先了解基本概念,因为您需要进行更改:

  1. 现有代码移动一个Component。您可能希望将其更改为 JLabel (with an Icon)

  2. 在创建动作时,您当前只需指定您希望 Component 移动的 x/y 值。现在您需要使用x/y values AND an Icon 创建动作,这样您就可以更改图标以随着每个方向的变化而绘制。

  3. 需要修改move(...) 方法以接受Icon,然后更改JLabel 组件的Icon。

【讨论】:

  • 你确定在 JFrame 中没有办法做到这一点吗?不管它多么低效?我的班级只做过 JFrame,我几乎可以肯定这种类型的编码会在测试中。
  • @McGovno 仅供参考:JFrame 可以支持键绑定 API
  • @McGovno, Are you absolutely positive there is no way to do this in JFrame? - 在 JFrame 中执行是什么意思?该示例确实使用了 JFrame。它使用 JPanel 进行自定义绘画并将其添加到 JFrame。您应该为 Swing 使用 JPanel,而不是 Canvas。
猜你喜欢
  • 2014-03-16
  • 2013-12-24
  • 2014-05-26
  • 2014-05-05
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
相关资源
最近更新 更多