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;
} else if(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); 
}}