簡體   English   中英

KeyListener的AWT-EventQueue-0錯誤

[英]AWT-EventQueue-0 Error with KeyListener

我制作了2個可與鍵偵聽器一起移動的對象。 它們可以正確移動,但是每次按下按鈕時,在控制台中我都會收到此錯誤:

線程“ AWT-EventQueue-0”中的異常java.lang.UnsupportedOperationException:尚不支持。 在CatchMe.CatchMe.keyTyped(CatchMe.java:197)

我的代碼如下:

package CatchMe;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.Timer;

public class CatchMe extends JFrame implements ActionListener, KeyListener {

private Image dbImage;
private Graphics dbg;
int x = 200, y = 300;
int velX, velY;
int velX1, velY1;
int ScoreB1 = 0;
int ScoreR1 = 0;
Timer tm = new Timer(5, this);
long startTime = System.currentTimeMillis();
long onGoing;
String onG;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int width = (int) screenSize.getWidth();
int height = (int) screenSize.getHeight();
int recX = (width + 100) / 2, recY = (height + 100) / 2;

public CatchMe() {
    setSize(width, height);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);
    setVisible(true);
    tm.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
}

@Override
public void paint(Graphics g) {
    dbImage = createImage(getWidth(), getHeight());
    dbg = dbImage.getGraphics();
    paintComponent(dbg);
    g.drawImage(dbImage, 0, 0, this);
}

public void paintComponent(Graphics g) {
    Rectangle r1 = new Rectangle(recX, recY, 25, 25);
    Rectangle r2 = new Rectangle(x, y, 25, 25);
    g.setColor(Color.BLUE);
    g.fillRect(r1.x, r1.y, r1.width, r1.height);
    g.setColor(Color.RED);
    g.fillRect(r2.x, r2.y, r2.width, r2.height);
    g.setColor(Color.BLACK);
    g.fillRect(0, 20, 100, 50);
    g.fillRect(100, 20, 100, 50);
    g.fillRect(200, 20, 50, 50);
    g.setColor(Color.YELLOW);
    g.drawString("Score of Blue", 5, 40);
    String ScoreB = ScoreB1 + "";
    g.drawString(ScoreB, 5, 55);
    g.drawString("Score of Red", 110, 40);
    String ScoreR = ScoreR1 + "";
    g.drawString(ScoreR, 110, 55);
    g.drawLine(95, 20, 95, 69);
    g.drawLine(200, 20, 200, 69);
    g.setColor(Color.RED);
    onGoing = (System.currentTimeMillis() - startTime) / 1000;
    onG = onGoing + "";
    g.setColor(Color.YELLOW);
    g.drawString(onG, 220, 50);
    System.out.println(onGoing);
    if (r1.intersects(r2)) {
        if (onGoing <= 60 || (onGoing >= 120 && onGoing < 180)) {
            g.setColor(Color.BLUE);
            g.drawString("Blue Caught You!", 175, 90);
            ScoreB1++;

        } else if (onGoing >= 240) {
            if (ScoreB1 > ScoreR1) {
                Font font = new Font("Jokerman", Font.PLAIN, 50);
                g.setColor(Color.BLUE);
                g.drawString("BLUE WINS", 600, 400);
            } else if (ScoreB1 < ScoreR1) {
                Font font = new Font("Jokerman", Font.PLAIN, 50);
                g.setColor(Color.RED);
                g.drawString("RED WINS", 600, 400);
            }
        } else {
            g.setColor(Color.RED);
            g.drawString("Red Caught You!", 175, 90);
            ScoreR1++;
        }
        if (onGoing == 245) {

            System.exit(245);
        }
        repaint();
    }
}

@Override
public void actionPerformed(ActionEvent e) {
    x = x + velX;
    y = y + velY;
    recY += velY1;
    recX += velX1;
    if (x < 0) {
        velX = 0;
        x = 0;
    }
    if (x > width - 50) {
        velX = 0;
        x = width - 50;
    }
    if (y < 0) {
        velY = 0;
        y = 0;
    }
    if (y > height - 40) {
        velY = 0;
        y = height - 40;
    }
    //Second square
    if (recX < 0) {
        velX1 = 0;
        recX = 0;
    }
    if (recX > width - 50) {
        velX1 = 0;
        recX = width - 50;
    }
    if (recY < 0) {
        velY1 = 0;
        recY = 0;
    }
    if (recY > height - 40) {
        velY1 = 0;
        recY = height - 40;
    }
    repaint();
}

@Override
public void keyPressed(KeyEvent e) {
    int code = e.getKeyCode();
    if (code == KeyEvent.VK_LEFT) {
        velX = -5;
        velY = 0;
    }
    if (code == KeyEvent.VK_UP) {
        velX = 0;
        velY = -5;
    }
    if (code == KeyEvent.VK_RIGHT) {
        velX = 5;
        velY = 0;
    }
    if (code == KeyEvent.VK_DOWN) {
        velX = 0;
        velY = 5;
    }
    //Second Rect
    if (code == KeyEvent.VK_A) {
        velX1 = -5;
        velY1 = 0;
    }
    if (code == KeyEvent.VK_W) {
        velX1 = 0;
        velY1 = -5;
    }
    if (code == KeyEvent.VK_D) {
        velX1 = 5;
        velY1 = 0;
    }
    if (code == KeyEvent.VK_S) {
        velX1 = 0;
        velY1 = 5;
    }
}

@Override
public void keyReleased(KeyEvent e) {
    velX = 0;
    velY = 0;
    velX1 = 0;
    velY1 = 0;
}

public static void main(String[] args) {
    CatchMe main = new CatchMe();
}

@Override
public void keyTyped(KeyEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
@Override
public void keyTyped(KeyEvent e) {

}

將解決它,您在調用keyTyped時手動引發了異常。

keyTyped方法引發UnsupportedOperationException因為您是通過這種方式實現的(或者它是通過這種方式自動生成的):

@Override
public void keyTyped(KeyEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

每當鍵入鍵時,都會調用此方法,因此會引發異常。

要修復它,您需要更改此方法的主體。 如果您不希望它做任何事情,請將其主體留空:

@Override
public void keyTyped(KeyEvent e) {

}

如果要執行某些操作,則應根據所需的行為實現此方法。 例如,此實現每次鍵入鍵時都會打印一條消息:

 @Override
 public void keyTyped(KeyEvent e) {
     System.out.println("A key was typed");
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM