JAVA 利用线程实现月食动画

  • JAVA老师又留实验课的作业了,画月亮,本想着划水过,在网上搜搜就得了,但是老师要求可以改变参数,同学们都是自己写的,老是参考同学的怪不好意思的,还是自己写吧。
  • 在这里插入图片描述

代码如下:

package Moon;

import java.awt.Button;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.TexturePaint;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;
import java.util.RandomAccess;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.WindowConstants;

public class MyMoonJFrame  extends JFrame implements ActionListener {
	
	// 大小,位置 x,y,移速
	JComboBox<Integer> jComboBox1,jComboBox2,jComboBox3,jComboBox4;
	JPanel jPanel;
	Canvas canvas;
    int x=100,y=100;
    int x1;
	int velocity;
	int size=50 ;
	public MyMoonJFrame() {
		// TODO Auto-generated constructor stub
		this.setSize(1000,500);
		//this.setResizable(false);
		this.setLocationRelativeTo(null);
		Container container = this.getContentPane();

		jPanel = new JPanel();
		jPanel.setBackground(Color.white);
		jPanel.setSize(1000,50);
		JLabel jLabel1 = new JLabel("大小:");
		JLabel jLabel2 = new JLabel("X坐标:");
		JLabel jLabel3 = new JLabel("Y坐标:");
		JLabel jLabel4 = new JLabel("移速:");
	
		jComboBox1 = new JComboBox<Integer>();
		for(int i=100;i<1100;i+=100)
		{
			jComboBox1.addItem(i);
		}
		
		jComboBox1.addActionListener(this);
		jPanel.add(jLabel1);
		jPanel.add(jComboBox1);
		jComboBox2 = new JComboBox<Integer>();
		for(int i = 10; i<500; i+=10)
			jComboBox2.addItem(i);
		jComboBox2.addActionListener(this);
		jPanel.add(jLabel2);
		jPanel.add(jComboBox2);
		jComboBox3 = new JComboBox<Integer>();
		for(int i = 80; i<500; i+=10)
			jComboBox3.addItem(i);
		jComboBox3.addActionListener(this);
		jPanel.add(jLabel3);
		jPanel.add(jComboBox3);
		
		jComboBox4 = new JComboBox<Integer>();
		for(int i = 10; i<500; i+=10)
			jComboBox4.addItem(i);
		
		jComboBox4.addActionListener(this);
		jPanel.add(jLabel4);
		jPanel.add(jComboBox4);
		
		container.add(jPanel);
		// 新建一个Moon类,并且是继承的Canvas类,是在画布上进行操作,可以直接添加到容器中
		Moon moon = new Moon();
		container.add(moon);
		this.setVisible(true);
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}
	
	
	public static void main(String[] args) {
	new MyMoonJFrame();
	}
	
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub

			if(e.getSource() instanceof JComboBox)
			{
				 Integer integer = (Integer)jComboBox1.getSelectedItem();
				 size = integer;
			}
			if(e.getSource() instanceof JComboBox)
			{
				 Integer integer = (Integer)jComboBox2.getSelectedItem();
				 x = integer;
				 x1 = x+ size/2;
			}
			if(e.getSource() instanceof JComboBox)
			{
				 Integer integer = (Integer)jComboBox3.getSelectedItem();
				 y = integer;
			}
			if(e.getSource() instanceof JComboBox)
			{
				 Integer integer = (Integer)jComboBox4.getSelectedItem();
				 velocity = integer;
			}		
	}
	//内部类,放在一个类的内部可以使用x,y等一些变量,方便访问,
	class Moon extends Canvas implements Runnable{
		public Moon() {
			// TODO Auto-generated constructor stub
			this.setBackground(Color.black);
			Thread thread = new Thread(this);
			thread.start();
		}
		@Override
		public void paint(Graphics arg0) {
			// TODO Auto-generated method stub
			super.paint(arg0);
			arg0.setColor(Color.red.darker());
			arg0.fillOval(x, y, size, size);
			arg0.setColor(Color.black);
			arg0.fillOval(x1+size/2, y, size, size);
		}

		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(true){
				
				try {
					Thread.sleep(velocity);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				repaint();
				x1--;
				if(x1==x-size*3/2)
					x1=x+size/2;
			}
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值