[英]How to properly use keylistener in java
我試圖使用KeyListner
使用左右鍵向前和向后移動此游戲中的角色,但我似乎無法移動角色。 我沒有運氣地看着這些答案:
如何在Java中正確使用keyListener以及如何在java中使用KeyListener?
這是我的代碼:
package test2;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Test
{
public static void main(String[] args)
{
Frame A1 = new Frame();
}
}
class Frame
{
JFrame window;
public Frame ()
{
awt();
}
public void awt()
{
Design A2 = new Design()
{
@Override
public void keyTyped(KeyEvent e)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void keyPressed(KeyEvent e)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void keyReleased(KeyEvent e)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
};
window = new JFrame("Kyo's test");
window.setVisible(true);
window.setSize(1280, 786);
window.add(A2);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
abstract class Design extends JPanel implements ActionListener, KeyListener
{
// Timer objects for character and saws
Timer movementOfCharacter = new Timer(5, this);
Timer movementOfSaw = new Timer(15, this);
// Variables for movement
int xAxisOfCharacter = 50, velocityOfCharacter=2, yAxisOfSaw = 0, velocityOfSaw = 10;
private Image tree, background, character, saw;
// Constructor
Design()
{
movementOfCharacter.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
// Constructor of Graphics
protected void paintComponent(Graphics graphics)
{
super.paintComponent(graphics);
Graphics2D graphics2d = (Graphics2D) graphics;
graphics2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
movementOfSaw.start();
// Body for background
{
ImageIcon whale = new ImageIcon(this.getClass().getResource("whale.jpg"));
background = whale.getImage();
graphics2d.drawImage(background, 0, 0, getWidth(), getHeight(), this);
}
// Body for trees
{
ImageIcon environment = new ImageIcon(this.getClass().getResource("Tree_Alt.png"));
tree = environment.getImage();
graphics2d.drawImage(tree, getWidth()/8, getHeight()-217, this);
graphics2d.drawImage(tree, (getWidth()/5)*2, getHeight()-217, this);
graphics2d.drawImage(tree, (getWidth()/6)*4, getHeight()-217, this);
}
// Body for Saws of death
{
ImageIcon sawOfDeath = new ImageIcon(this.getClass().getResource("saw.gif"));
saw = sawOfDeath.getImage();
// First saw
{
graphics2d.drawImage(saw, (getWidth()/11), yAxisOfSaw, 100, 100, this);
}
// Second saw
{
graphics2d.drawImage(saw, (getWidth()/7)*2, yAxisOfSaw, 100, 100, this);
}
// Thirf saw
{
graphics2d.drawImage(saw, (getWidth()/2)-10, yAxisOfSaw, 100, 100, this);
}
// Fourth saw
{
graphics2d.drawImage(saw, (getWidth()/6)*4, yAxisOfSaw, 100, 100, this);
}
// Fifth saw
{
graphics2d.drawImage(saw, (getWidth()/6)*5, yAxisOfSaw, 100, 100, this);
}
}
// Body for exit
{
graphics.setColor(Color.red);
graphics.fillRect(getWidth()-5, getHeight()-150, 5, 150);
}
// Body for Character
{
ImageIcon blanka = new ImageIcon(this.getClass().getResource("Blank.gif"));
character = blanka.getImage();
graphics2d.drawImage(character, xAxisOfCharacter, getHeight()-150, 150, 155, this);
}
}
public void actionPerformed(ActionEvent e)
{
yAxisOfSaw += velocityOfSaw;
if(yAxisOfSaw > 0 || yAxisOfSaw < getHeight()-100)
velocityOfSaw = -velocityOfSaw;
repaint();
}
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
if(key == KeyEvent.VK_LEFT)
{
velocityOfCharacter = -5;
}
if(key == KeyEvent.VK_RIGHT)
{
velocityOfCharacter = 5;
}
}
public void keyTyped(KeyEvent e)
{
}
public void keyReleased(KeyEvent e)
{
}
}
誰能告訴我在哪里以及我在這里做錯了什么?
當你這樣做
Design A2 = new Design() {
@Override
public void keyTyped(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void keyPressed(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void keyReleased(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
};
您只需拋出異常就會覆蓋您在Design
抽象類中編寫的代碼。
您的Design
類不必是abstract
因為它沒有未實現的方法。 所以我可以看到兩種方法來使用你在Design
類中編寫的代碼:
第一種方式
刪除abstract
關鍵字,以便您可以像使用new
關鍵字的普通類一樣實例化Design
類。 所以以這種方式聲明Design
類:
class Design extends JPanel implements ActionListener, KeyListener
然后以這種方式實例化A2:
Design A2 = new Design();
第二種方式
如果由於某種原因,您需要該類是抽象的,那么以這種方式實例化您的A2對象:
Design A2 = new Design() {};
這將起作用,而不會覆蓋您在Design
類中編寫的任何方法。 但這沒有多大意義,上面的第一種方式更有意義。
注1
現在,如果在Design.keyPressed
添加打印輸出,您可以看到它被調用(您將在控制台中看到日志):
public void keyPressed(KeyEvent e) {
System.out.println("KeyEvent: "+e);
int key = e.getKeyCode();
...
筆記2
另外看keyPressed
方法,我認為你還需要更新字符X軸坐標,所以在if語句之后添加這一行:
xAxisOfCharacter += velocityOfCharacter;
它應該如下所示:
public void keyPressed(KeyEvent e) {
System.out.println("KeyEvent: "+e);
int key = e.getKeyCode();
if(key == KeyEvent.VK_LEFT) {
velocityOfCharacter = -5;
}
else if(key == KeyEvent.VK_RIGHT) {
velocityOfCharacter = 5;
}
xAxisOfCharacter += velocityOfCharacter;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.