首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

为什么小弟我的keylistener不响应(加入了一个小线程)帮帮小弟我

2012-03-23 
为什么我的keylistener不响应(加入了一个小线程)帮帮我packagethreadimportjava.awt.BorderLayoutimport

为什么我的keylistener不响应(加入了一个小线程)帮帮我
package   thread;

import   java.awt.BorderLayout;
import   java.awt.DisplayMode;
import   java.awt.event.KeyEvent;
import   java.awt.event.KeyListener;

import   javax.swing.ImageIcon;
import   javax.swing.JFrame;
import   javax.swing.JLabel;
import   javax.swing.JSlider;
import   javax.swing.JToolBar;
import   javax.swing.event.ChangeEvent;
import   javax.swing.event.ChangeListener;

public   class   ProtectedScreen   extends   JFrame   implements   Runnable,   KeyListener{

//球左上角坐标
private   int   x;
private   int   y;
//球大小
private   int   ballWidth;
private   int   ballHeight;  
private   int   interval;   //运动幅度
private   int   speed;   //小球运动速度  
private   int   direction;   //小球的运动方向

private   static   int   NW   =   0;
private   static   int   NE   =   1;
private   static   int   SW   =   2;
private   static   int   SE   =   3;

private   JLabel   ball   ;
private   JToolBar   toolBar;  
private   JSlider   slider;

public   ProtectedScreen(){

initToolBar();
initBall();

this.addKeyListener(this);
//this.requestFocus();
//this.requestFocusInWindow();
//this.getContentPane().addKeyListener(this);
//this.getContentPane().requestFocus();
this.getContentPane().setLayout(new   BorderLayout());
this.getContentPane().add(toolBar,   BorderLayout.NORTH);
this.getContentPane().add(ball,   BorderLayout.SOUTH);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(800,   600);
this.setTitle( "屏幕保护 ");
//this.setFullScreen();
}

/*private   void   setFullScreen()   {
  DisplayMode   displayMode;
  displayMode   =   new   DisplayMode(800,   600,   16,
                                DisplayMode.REFRESH_RATE_UNKNOWN);
    SimpleScreenManager   screen   =   new   SimpleScreenManager();
    screen.setFullScreen(displayMode,   this);
}*/

private   void   initBall()   {
x   =   50;  
y   =   50;
ballWidth   =   100;
ballHeight   =   50;
interval   =   5;
speed   =   1000   /   slider.getValue();
ImageIcon   icon   =   new   ImageIcon( "Blue   hills.jpg ");
ball   =   new   JLabel(icon);
ball.setBounds(x,   y,   ballWidth,   ballHeight);
}

private   void   initToolBar()   {
if(toolBar   ==   null)   {
toolBar   =   new   JToolBar();
toolBar.setFloatable(true);
//初始化slider
slider   =   new   JSlider();
slider.setMinimum(1);
slider.setMaximum(100);
slider.setValue(30);
//slider.setExtent(5);
slider.addChangeListener(new   ChangeListener(){

public   void   stateChanged(ChangeEvent   e)   {
speed   =   1000   /   ((JSlider)e.getSource()).getValue();


//System.out.println(((JSlider)e.getSource()).getValue());
}

});

//加入到工具条中
toolBar.add(slider);
}
}

private   void   moveNorthWest()   {
x   -=   interval;
y   -=   interval;
ball.setBounds(x,   y,   ballWidth,   ballHeight);
}

private   void   moveNorthEast()   {
x   +=   interval;
y   -=   interval;
ball.setBounds(x,   y,   ballWidth,   ballHeight);
}

private   void   moveSouthWest()   {
x   -=   interval;
y   +=   interval;
ball.setBounds(x,   y,   ballWidth,   ballHeight);
}

private   void   moveSouthEast()   {
x   +=   interval;
y   +=   interval;
ball.setBounds(x,   y,   ballWidth,   ballHeight);
}

public   void   run()   {


direction   =   this.SE;   //初始化方向
//记录上次x,y坐标
int   preX   =   0;
int   preY   =   0;


while(true)   {
//得到屏幕宽度和高度
int   frameWidth   =   this.getContentPane().getWidth();
int   frameHeight   =   this.getContentPane().getHeight();

switch(direction){
case   0:   moveNorthWest();
break;
case   1:   moveNorthEast();
break;
case   2:   moveSouthWest();
break;
case   3:   moveSouthEast();
break;
}
//休息一下
try   {
Thread.sleep(speed);
}   catch   (InterruptedException   e)   {
//   TODO   Auto-generated   catch   block
e.printStackTrace();
}
//System.out.println( "x:   "   +   x   +   "   y:   "   +   y)   ;
//到边缘时更改方向
if(y   +   ballHeight   > =   frameHeight)   {
if(preX   <   x)   direction   =   NE;
else   direction   =   NW;
}   elseif(x   +   ballWidth   > =   frameWidth)   {
if(preY   <   y)   direction   =   SW;
else   direction   =   NW;
}else   if(y   <=   0)   {
if(preX   >   x)   direction   =   SW;
else   direction   =   SE;
}   else   if(x   <=   0)   {
if(preY   >   y)   direction   =   NE;
else   direction   =   SE;
}
//保存上一次坐标
preX   =   x;   preY   =   y;  
}
}

/**
  *   @param   args
  */
public   static   void   main(String[]   args)   {
//   TODO   Auto-generated   method   stub
ProtectedScreen   ps   =   new   ProtectedScreen();
ps.setVisible(true);
//Thread   thread   =   new   Thread(ps);
//thread.start();
new   Thread(ps).start();
}
public   void   keyTyped(KeyEvent   e)   {
//   TODO   Auto-generated   method   stub
System.out.println( "typed ");
System.exit(0);
}
public   void   keyPressed(KeyEvent   e)   {


//   TODO   Auto-generated   method   stub
System.out.println( "pressed ");
System.exit(0);
}
public   void   keyReleased(KeyEvent   e)   {
//   TODO   Auto-generated   method   stub
System.out.println( "Released ");
System.exit(0);  
}

}


[解决办法]
加一句

this.setFocusable(true);


在ProtectedScreen 的构造函数中

热点排行