- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我之前将舞台类设置为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/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!