java 能否实现桌面下雪花的效果?使用swing?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 能否实现桌面下雪花的效果?使用swing?相关的知识,希望对你有一定的参考价值。
如题,请高手作答。如果可以,使用那些类,最好有源代码
/**实现在窗体上随机布满300个雪花("*"),滚动
*在上次的课基础上增加了for循环(一次要产生300个变量),随机数,数组 ;
*下面的序号为步骤
*/ import java.awt.* ; //(3)导入awt包
public class Star
public static void main(String args[])
Frame w = new Frame() ; //(1)绘制窗体
w.setSize(1024,768) ; //(4)把窗体布满全屏
w.setBackground(Color.BLACK) ; //(5)背景为黑颜色
MyPanel mp = new MyPanel() ; //(7)把MyPanel对象mp,添加到窗体w上
w.add(mp) ;
Thread t = new Thread(mp) ;
t.start() ; //(12)启动线程
w.show(); //(2)显示窗体
//(6)继承Panel类
class MyPanel extends Panel implements Runnable //(11)实现Runnable接口
int x[] = new int[300] ;
int y[] = new int[300] ; //(8)定义300个数组变量 MyPanel()
for(int i = 0;i < 300; i++)
x[i] = (int)(Math.random()*1024) ;
y[i] = (int)(Math.random()*768) ; //(9)当程序走到第6步的时候程序就会调用构成函数
//由于随机数是从0-1之间的数任意产出所以x乘以1024,y乘以768再转换为int类型
public void paint(Graphics g)
for(int i = 0;i < 300; i++)
g.setColor(Color.WHITE) ;
g.drawString("*",x[i],y[i]) ;
//g.drawString("*",30,30) ;(7)绘制一个星星在屏幕的x=30,y=30的位置上
//(10)绘制300个雪花,把坐标30,30,改成x[i],y[i] ;
//做到这步可以实现在黑色的天空布满300个星星
public void run()
while(true) //(13)实现产生300个雪花往下落死循环
for(int i = 0 ; i < 300; i++)
y[i]++ ; //(14)y坐标不断的+1
if(y[i] > 768) //(18)如果y轴坐标大于768时,则y = 0,回到窗体的顶部
y[i] = 0 ;
try //(16)用try,catch解决线程休眠的异常
Thread.sleep(20) ; //(15)在每次y轴坐标+1后线程休眠20毫秒
catch(Exception e)
repaint() ; //(17)雪花在新的位置重画
参考技术A 应该不行吧!
WPF桌面下雪效果
寄存在canvas面板,目前缺点就是开始的时候效果有点别扭。
直接贴代码:
1 void StartSnowing(Canvas panel) 2 { 3 Random random = new Random(); 4 Task.Factory.StartNew(new Action(() => 5 { 6 for (int j = 0; j < 10; j++) 7 { 8 Thread.Sleep(j * 100); 9 Dispatcher.Invoke(new Action(() => 10 { 11 int snowCount = random.Next(0, 20); 12 for (int i = 0; i < snowCount; i++) 13 { 14 int width = random.Next(10, 20); 15 PackIconFontAwesome pack = new PackIconFontAwesome() 16 { 17 Kind = PackIconFontAwesomeKind.SnowflakeRegular, 18 Width = width, 19 Height = width, 20 Foreground = Brushes.White, 21 BorderThickness = new Thickness(0), 22 RenderTransform = new RotateTransform(), 23 }; 24 int left = random.Next(0, (int)panel.ActualWidth); 25 Canvas.SetLeft(pack, left); 26 panel.Children.Add(pack); 27 int seconds = random.Next(10, 20); 28 DoubleAnimationUsingPath doubleAnimation = new DoubleAnimationUsingPath() 29 { 30 Duration = new Duration(new TimeSpan(0, 0, seconds)), 31 RepeatBehavior = RepeatBehavior.Forever, 32 PathGeometry = new PathGeometry(new List<PathFigure>() { new PathFigure(new Point(left, 0), new List<PathSegment>() { new LineSegment(new Point(left, panel.ActualHeight), false) }, false) }), 33 Source = PathAnimationSource.Y 34 }; 35 pack.BeginAnimation(Canvas.TopProperty, doubleAnimation); 36 DoubleAnimation doubleAnimation1 = new DoubleAnimation(360, new Duration(new TimeSpan(0, 0, 10))) 37 { 38 RepeatBehavior = RepeatBehavior.Forever, 39 40 }; 41 pack.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, doubleAnimation1); 42 } 43 })); 44 } 45 })); 46 }
以上是关于java 能否实现桌面下雪花的效果?使用swing?的主要内容,如果未能解决你的问题,请参考以下文章
[js高手之路]html5 canvas动画教程 - 下雪效果