Pallina

Pallina

JBall

package pallina;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JComponent;

public class JBall extends JComponent implements Runnable {

	private boolean running = false;
	private int vx = 10, vy = 10;

	public JBall() {
		this.setPreferredSize(new Dimension(15, 15));
	}

	public boolean isRunning() {
		return running;
	}

	public void setRunning(boolean running) {
		this.running = running;
	}

	public int getVx() {
		return vx;
	}

	public void setVx(int vx) {
		if (Math.abs(vx) <= 10)
			this.vx = vx;
	}

	public int getVy() {
		return vy;
	}

	public void setVy(int vy) {
		if (Math.abs(vy) <= 10)
			this.vy = vy;
	}

	@Override	
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);

		int w = this.getWidth();
		int h = this.getHeight();

		Graphics2D g2 = (Graphics2D) g;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g2.setColor(Color.GREEN);
		g2.fillOval(0, 0, w, h);
		g2.setColor(Color.BLACK);
		g2.drawOval(0, 0, w - 1, h - 1);
	}

	public void start() {
		if (!running) {
			running = true;
			Thread t = new Thread(this);
			t.setDaemon(true);
			t.start();
		}
	}

	public void stop() {
		running = false;
	}

	@Override
	public void run() {
		while (running) {
			int x = this.getX();
			int y = this.getY();
			x += vx;
			y += vy;
			Component contenitore = this.getParent();
			if (x < 0) {
				vx = Math.abs(vx);
				x += vx;
			}
			if (x > contenitore.getWidth() - this.getWidth()) {
				vx = -Math.abs(vx);
				x += vx;
			}
			if (y < 0) {
				vy = Math.abs(vy);
				y += vy;
			}
			if (y > contenitore.getHeight() - this.getHeight()) {
				vy = -Math.abs(vy);
				y += vy;
			}
			this.setLocation(x, y);
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
			}
		}

	}

}

Main

package pallina;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.SpringLayout;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Main extends JFrame {
	
	private JBall ball;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main frame = new Main();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Main() {
		setTitle("Pallina");
		setBounds(100, 100, 450, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		SpringLayout springLayout = new SpringLayout();
		getContentPane().setLayout(springLayout);
		
		JButton btnStart = new JButton("Start");
		btnStart.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				start();
			}
		});
		springLayout.putConstraint(SpringLayout.WEST, btnStart, 10, SpringLayout.WEST, getContentPane());
		springLayout.putConstraint(SpringLayout.SOUTH, btnStart, -10, SpringLayout.SOUTH, getContentPane());
		getContentPane().add(btnStart);
		
		JButton btnStop = new JButton("Stop");
		btnStop.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				stop();
			}
		});
		springLayout.putConstraint(SpringLayout.NORTH, btnStop, 0, SpringLayout.NORTH, btnStart);
		springLayout.putConstraint(SpringLayout.WEST, btnStop, 6, SpringLayout.EAST, btnStart);
		getContentPane().add(btnStop);

		JPanel panel = new JPanel();
		panel.setLayout(null);
		panel.setBackground(Color.WHITE);
		panel.setBorder(new LineBorder(new Color(0, 0, 0)));
		springLayout.putConstraint(SpringLayout.NORTH, panel, 10, SpringLayout.NORTH, getContentPane());
		springLayout.putConstraint(SpringLayout.WEST, panel, 10, SpringLayout.WEST, getContentPane());
		springLayout.putConstraint(SpringLayout.EAST, panel, -10, SpringLayout.EAST, getContentPane());
		springLayout.putConstraint(SpringLayout.SOUTH, panel, -6, SpringLayout.NORTH, btnStart);
		getContentPane().add(panel);		

		ball = new JBall();
		ball.setBounds(10, 10, 15, 15);
		panel.add(ball);
	}
	
	private void start() {
		ball.start();
	}
	
	private void stop() {
		ball.stop();
	}
	
}

Progetto Eclipse: Pallina