关于窗口与按钮焦点引起的KeyListnere失效的问题

来源:互联网 发布:java 取TXT 前面几行 编辑:程序博客网 时间:2024/06/16 08:18

package homework;

import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

import javax.swing.JFrame;

public class MyFrame extends Frame{

ArrayList<Ball> balls = new ArrayList<Ball>();

public static final int HEIGHT = 768 /2;
public static final int WIDTH = 1366 /2;
double x,y;
int countBall = 0;
Image offScreenImage = null;
//        Image img = GameUtil.getImage("imgs/GEM.jpg");

public static void main(String[] args) {
MyFrame mf = new MyFrame();
mf.start(mf);
}

public void start(MyFrame mf) {

//         不显示栏
//         this.setUndecorated(true);

Ball ball = new Ball(0, 0);
balls.add(ball);


this.setSize(WIDTH, HEIGHT);
this.setTitle("模拟屏保");
this.setResizable(false);
this.setVisible(true);

this.setLayout(new FlowLayout());

Button button1 = new Button("+");
Button button2 = new Button("-");
this.add(button1);
this.add(button2);

button1.setFocusable(false);
button2.setFocusable(false);

//         全屏
//                GraphicsDevice myDevice =
                                  GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
//         myDevice.setFullScreenWindow(this);

MyFrame.this.requestFocus();
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("a Key was Pressed ! ");
//         System.exit(0);
}
});

button1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(countBall <= 20) {
x = (WIDTH*3/4) * Math.random();
y = (HEIGHT*3/4) * Math.random();
balls.add(new Ball(x, y));
countBall ++;
}
//         MyFrame.this.requestFocus();
}
});

button2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(countBall >= 0) {
balls.remove(countBall);
countBall --;
}
//         MyFrame.this.requestFocus();
}
});

new Thread(new PaintThread()).start();

this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

}

public void update(Graphics g) {       
if(offScreenImage == null) {
offScreenImage = this.createImage(WIDTH, HEIGHT);
}

Graphics gOffScreen = offScreenImage.getGraphics();

Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.WHITE);
gOffScreen.fillRect(0, 0, WIDTH, HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);

g.drawImage(offScreenImage, 0, 0, null);
}

@Override
public void paint(Graphics g) {
//         g.drawImage(img, 0, 0, null);

for(int i=0; i<balls.size(); i++) {
Ball ball = balls.get(i);
ball.draw(g);
}
}


private class PaintThread implements Runnable {
@Override
public void run() {
while(true) {
repaint();
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}


Ball类
package homework;
import java.awt.*;

public class Ball {
double x = 10;
double y = 32;
double speedX = 4;
double speedY = 4;
double changeA = 1;
double changeB = 2;
double changeC = 3;
int A, B, C = 0;

public Ball (double x, double y) {
this.x = x + this.x;
this.y = y + this.y;
}

public void draw(Graphics g) {
Color c = g.getColor();
g.setColor(new Color(A, B, C));
g.fillOval((int)x, (int)y, 100, 100);

x += speedX;
y += speedY;
A += changeA;
B += changeB;
C += changeC;
if(A >= 255 || A <= 0 ) changeA = -changeA;
if(B >= 254|| B <= 0 ) changeB = -changeB;
if(C >= 253|| C <= 0 ) changeC = -changeC;
if(x >= MyFrame.WIDTH-102 || x <= 8)  speedX = -speedX;
if(y >= MyFrame.HEIGHT-102 || y <= 28)  speedY = -speedY;
g.setColor(c);
}
}
0 0