该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import javax.swing.*;
public class Bounce {
/**
* @param args
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
BallFrame f = new BallFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}
class BallFrame extends JFrame {
private Timer timer;
private Action start, stop;
private PaintPanel panel;
public BallFrame() {
setTitle("Ball");
panel = new PaintPanel();
panel.addBall(new Ball(20, 20));
panel.setPreferredSize(new Dimension(500, 400));
getContentPane().add(panel, BorderLayout.CENTER);
timer = new Timer(10, panel);
JPanel control = new JPanel(); // FlowLayout(FlowLayout.CENTER)
start = new AbstractAction("Start") {
@Override
public void actionPerformed(ActionEvent e) {
if( !timer.isRunning() )
timer.start();
start.setEnabled(false);
stop.setEnabled(true);
}
};
stop = new AbstractAction("Stop") {
@Override
public void actionPerformed(ActionEvent e) {
if( timer.isRunning() )
timer.stop();
start.setEnabled(true);
stop.setEnabled(false);
}
};
stop.setEnabled(false);
control.add(new JButton(start));
control.add(new JButton(stop));
getContentPane().add(control, BorderLayout.SOUTH);
pack();
}
}
class Ball {
private int x, y, dx = 1, dy = 1; //dx,dy 是移动的量· x,y 是坐标
public Ball(int x, int y) {
this.x = x;
this.y = y;
}
public void move(int x_max, int y_max) {
x += dx;
y += dy;
if( x < 0 ) {
dx = -dx;
x += 2 * dx;
}
if( y < 0 ) {
dy = -dy;
y += 2 * dy;
}
if( x > x_max ) {
dx = -dx;
x += 2 * dx;
}
if( y > y_max ) {
dy = -dy;
y += 2 * dy;
}
}
public Ellipse2D getShape() {
return new Ellipse2D.Double(x, y, 20, 20);
}
}
class PaintPanel extends JComponent implements ActionListener {
private java.util.List balls = new ArrayList();
public void addBall(final Ball b) {
if( b == null )
return;
if( EventQueue.isDispatchThread() )
balls.add(b);
else {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
addBall(b);
}
});
}
}
@Override
public void paintComponent(Graphics g) {
@SuppressWarnings("unchecked")
Graphics2D g2 = (Graphics2D)g.create();
g2.setColor(Color.BLUE);
for(Ball b : balls)
g2.fill(b.getShape());
g2.dispose();
}
@Override
public void actionPerformed(ActionEvent e) {
for(Ball b : balls)
b.move(getWidth(), getHeight());
repaint();
}
}
@Deprecated
class Run implements Runnable {
int height = 0, width = 0;
Ball ball;
Component c;
PaintPanel p;
BallFrame bf;
public Run(Ball ball, PaintPanel p) {
this.ball = ball;
this.c = p;
}
@Override
public void run() {
System.out.println("进入线程?");
BallFrame ballFrame = new BallFrame();
height = ballFrame.getHeight();
width = ballFrame.getWidth();
for(int i = 1; i < 100; i++) {
try {
System.out.println("move " + i);
ball.move(width, height);
c.repaint();
Thread.sleep(1);
}
catch(InterruptedException e) {
}
}
}
}