KeyListener和runnable不起作用

时间:2013-06-18 03:47:54

标签: java image swing paint keylistener

我之前将舞台课程设为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();
    }
}

1 个答案:

答案 0 :(得分:2)

不要覆盖paint()和update()。这仅适用于AWT组件,而不适用于Swing组件。

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

关键事件仅发送到具有焦点的组件。您需要使面板具有可聚焦性。

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