读书人

为什么小弟我的keylistener不响应(加

发布时间: 2012-03-23 12:06:21 作者: rapoo

为什么我的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 的构造函数中

读书人网 >J2SE开发

热点推荐