有趣的java彩蛋程序

有趣的java彩蛋程序

帮别人做课程设计,无意中看到一道彩蛋程序的题。觉得挺有意思的,这也是我第一次接触到动态显示的程序,感觉很有趣,很乐意在这里跟大家分享一下。

题目的要求是从界面输入行数和列数后,按下确定按钮后,在界面正中央出现一系列颜色不断变化闪烁的椭圆形彩蛋。

实现的思路也很简单,界面就不说了,彩蛋的绘制思路就是通过随机数使椭圆颜色的三个参数值不断变化,再通过不断重绘实现图形的“闪烁”。注意为了使程序灵活性更高,要把重绘放到一个线程中运行,防止整个窗体陷入死循环。

废话不多说了直接贴代码。

PS:我后来想了想,其实稍稍一改还可以做出颜色由浅到深类似呼吸灯的变化效果,或者同时实现彩蛋的位置不断移动,即完全的动画效果,大家可以一起试试!

 

主窗体:

package 彩蛋;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MyJFrame extends JFrame{
	public DrawComponent dc = new DrawComponent();

	public static void main(String[] args) {
		MyJFrame jmf= new MyJFrame();
		jmf.initUI();
	}

	private void initUI() {
		
		this.setSize(600,500);
		this.setDefaultCloseOperation(3);
		this.setTitle("我的彩蛋");
		JPanel jp = new JPanel();
		jp.setSize(50, 0);
		jp.setLayout(new FlowLayout());
		this.add(BorderLayout.SOUTH,jp);
		JLabel j1 = new JLabel("行数");
		JTextField jtf1 = new JTextField();
		jtf1.setPreferredSize(new Dimension(20,30));
		JLabel j2 = new JLabel("列数");
		JTextField jtf2 = new JTextField();
		jtf2.setPreferredSize(new Dimension(20,30));
		JButton jb = new JButton("确定");
		
		MyActionListener ma = new MyActionListener(dc,jtf1,jtf2);
		jb.addActionListener(ma);
		jp.add(j1);
		jp.add(jtf1);
		jp.add(j2);
		jp.add(jtf2);
		jp.add(jb);
		this.add(dc);
		
		this.setVisible(true);
		
	}
	
}

 

绘制彩蛋的组件

package 彩蛋;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JComponent;

public class DrawComponent extends JComponent {
	private int row =0,column = 0;
	
	//重绘方法
	public void paintComponent(Graphics g) {
		this.setPreferredSize(new Dimension(400,400));
		Random rand = new Random();
		for(int i = 0;i<this.row;i++){
			for(int j = 0;j<this.column;j++){
				int r1 = rand.nextInt(256);
				int g1 = rand.nextInt(256);
				int b1 = rand.nextInt(256);
				Color c = new Color(r1,g1,b1);
				g.setColor(c);
				g.fillOval(j*100+100, i*50+50, 100, 50);
			}
		}	
	}
	
	public int getRow() {
		return row;
	}

	public void setRow(int row) {
		this.row = row;
	}

	public int getColumn() {
		return column;
	}

	public void setColumn(int column) {
		this.column = column;
	}

}

 监听器:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JTextField;

public class MyActionListener implements ActionListener {

	public JTextField jtf1,jtf2;
	public DrawComponent dc;
	private MyThread m1;
	
	public MyActionListener(DrawComponent dc,JTextField jtf1, JTextField jtf2) {
		this.dc = dc;
		this.jtf1 = jtf1;
		this.jtf2 = jtf2;
	}

	public void actionPerformed(ActionEvent e) {
		//得到文本框的文本值
		int row = Integer.parseInt(this.jtf1.getText());
		int column = Integer.parseInt(this.jtf2.getText());
		
		//启动线程
		if(m1 == null){
			m1 = new MyThread(this.dc);
			m1.start();
		}
		this.dc.setColumn(column);
		this.dc.setRow(row);
	}

}

 

线程:

package 彩蛋;

class MyThread extends Thread{
    public DrawComponent dc;
    
	public MyThread(DrawComponent dc){
		this.dc = dc;
	}
	
	public void run(){
		while (true){
		this.dc.repaint();
		}
	}
}

猜你喜欢

转载自t1174779123.iteye.com/blog/1905602