gpt4 book ai didi

java - KeyListener 和 runnable 不起作用

转载 作者:行者123 更新时间:2023-12-02 06:57:16 25 4
gpt4 key购买 nike

我之前将舞台类设置为JFrame,一切运行良好..直到我尝试将其设置为JPanel,然后它就停止了,什么也没有发生。 KeyListener 不起作用,知道我的源有什么问题

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
import javax.imageio.ImageIO;
class stage extends JPanel implements Runnable,KeyListener
{
private int timer;
int y_back = -4500;
int x_back = 0;
int x_player =295;
int y_player = 590;
int x_nenek = 600;
private Image img;
private Image img_player;
private Image img_nenek;
stage()
{
super();
//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(0,0);
setSize(700,700);
//setResizable(false);
setVisible(true);
try{
img = ImageIO.read(getClass().getResourceAsStream("jalan.png"));
img_player= ImageIO.read(getClass().getResourceAsStream("player.png"));
img_nenek= ImageIO.read(getClass().getResourceAsStream("Nenek.png"));
}
catch(Exception e){}
new Thread(this).start();
addKeyListener(this);
}
public void update(Graphics g)
{
paint(g);
}
public void paint(Graphics g)
{
g.drawImage(img,x_back,y_back+200,null);//background
g.drawImage(img_player,x_player,y_player,null);//player
g.drawImage(img_nenek,x_nenek,y_back+1750,null);// nenek
}
public void keyPressed(KeyEvent e)
{
int c = e.getKeyCode();
if (y_back<-200)
{
if (c == KeyEvent.VK_UP)
{
if(x_nenek>=200 &&x_nenek<=500)
{
JOptionPane.showMessageDialog(null,"awas ada yang menyeberang","Ehem~~~~",JOptionPane.WARNING_MESSAGE);
y_back+=0 ;
}
if (x_player >=310 && y_back>=-3550 && y_back<= -3400)
{
JOptionPane.showMessageDialog(null,"Kamu telah masuk kubangan","peringatan",JOptionPane.WARNING_MESSAGE);
y_back =-4500;
}

if (x_player <=265 && y_back >=-3300 && y_back <=-3250)
{
JOptionPane.showMessageDialog(null,"Kamu telah masuk kubangan","Peringatan",JOptionPane.WARNING_MESSAGE);
y_back =-4500;
}
if ((x_player>=182 && x_player<=365) && (y_back>=-2100 && y_back<=-1800))//clear
{
JOptionPane.showMessageDialog(null," itu lubang mas =_+ , balik sana","Peringatan",JOptionPane.WARNING_MESSAGE);
y_back =-4500;
}
if ((x_player>=130 && x_player <=200)&& y_back>=-900 && y_back<=-800)
{
JOptionPane.showMessageDialog(null,"baksoooooooooooooo","Peringatan",JOptionPane.WARNING_MESSAGE);
y_back -=10;
}
if ((x_player>=280 && x_player<=600) && y_back>=-750)//clear
{
JOptionPane.showMessageDialog(null,"lewat kiri mas =_+","Peringatan",JOptionPane.WARNING_MESSAGE);
y_back -=10;
}

if((x_player>=130 && x_player <=180) && y_back>=-4200 && y_back<=-4000) // clear
{
JOptionPane.showMessageDialog(null,"Minggir... ntar ketatap mas =_=","Peringatan",JOptionPane.WARNING_MESSAGE);
y_back -=10;

}

if((x_player >= 0 && x_player<= 275 && y_back>=-2800 && y_back<=-2600) || x_player >=400&& y_back>=-2800 && y_back<=-2600)//clear
y_back +=0;
else
y_back+=10;
}
if (c == KeyEvent.VK_LEFT && x_player>135)
{
if(x_nenek>=200 &&x_nenek<=500)
{
JOptionPane.showMessageDialog(null,"awas ada yang menyeberang","Ehem~~~~",JOptionPane.WARNING_MESSAGE);

}
if (x_player <=265 && y_back >=-3300 && y_back <=-3250)
{
JOptionPane.showMessageDialog(null,"Kamu telah masuk kubangan","Peringatan",JOptionPane.WARNING_MESSAGE);
y_back =-4500;
}
if ((x_player>=130 && x_player <=200)&& y_back>=-900 && y_back<=-800)
{
JOptionPane.showMessageDialog(null,"baksoooooooooooooo","Peringatan",JOptionPane.WARNING_MESSAGE);
y_back -=3;
x_player+=3;
}
if ((x_player>=182 && x_player<=365) && (y_back>=-2100 && y_back<=-1700))//clear
{
JOptionPane.showMessageDialog(null," itu lubang mas =_+ , balik sana","Peringatan",JOptionPane.WARNING_MESSAGE);
y_back =-4500;
}
if((x_player>=130 && x_player <=180) && y_back>=-4200 && y_back<=-4000)// clear
{
JOptionPane.showMessageDialog(null,"Minggir... ntar ketatap mas =_=","Peringatan",JOptionPane.WARNING_MESSAGE);
y_back -=3;
x_player-=3;
}
else
x_player-=3;
y_back +=3;

}
if (c == KeyEvent.VK_RIGHT && x_player<465)
{
if(x_nenek>=200 &&x_nenek<=500)//clear
{
JOptionPane.showMessageDialog(null,"awas ada yang menyeberang","Ehem~~~~",JOptionPane.WARNING_MESSAGE);
y_back+=5;
x_player+=5;
}
if (x_player >=340 && y_back>=-3550 && y_back<= -3400)
{
JOptionPane.showMessageDialog(null,"Kamu telah masuk pada kubangan","peringatan",JOptionPane.WARNING_MESSAGE);
y_back =-4500;
}
if ((x_player>=280 && x_player<=600) && y_back>=-750)
JOptionPane.showMessageDialog(null,"lewat kiri mas =_+","Peringatan",JOptionPane.WARNING_MESSAGE);
x_player+=3;
y_back +=3;
}
}
else
JOptionPane.showMessageDialog(null,"Selamat, kamu sudah sampai di tempat tujuan","",JOptionPane.WARNING_MESSAGE);
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
public void run()
{
while (true)
try
{
repaint();
if(y_back>=-2000)
x_nenek-=10;
Thread.sleep(200);
}
catch (Exception e)
{
}
}
}
public class Tes2 extends JFrame
{
Tes2()
{
stage s = new stage();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(50,50);
setSize(700,700);
setResizable(false);
setVisible(true);
add(s);
}
public static void main(String[] args)
{
new Tes2();
}
}

最佳答案

不要重写paint()和update()。这仅适用于 AWT 组件,不适用于 Swing 组件。

对于 JPanel 上的自定义绘制,您可以重写 paintComponent() 方法,并确保在开始时调用 super.paintComponent()。阅读 Swing 教程中关于 Custom Painting 的部分了解更多信息和工作示例。

按键事件仅分派(dispatch)给具有焦点的组件。您需要使面板可聚焦。

但是,通常您不应该使用 KeyListener。更好的方法是使用按键绑定(bind)。查看Motion With the Keyboard有关此主题的更多信息和一些工作示例以及 Swing 教程的链接。

关于java - KeyListener 和 runnable 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17160237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com