我用Java画了一棵圣诞树

2021年12月15日更新说明:

完整项目已经放到github上,可以随意下载并直接运行,只求点个星github链接

评论区常见问题

  • 无法运行: 运行程序要从mian函数开始,从Main.java执行运行操作即可
  • 可以正常运行但没有音乐: java播放音乐的功能有点坑,有的版本可能过时了就没有声音,本人实现的代码中要求音乐格式为wav。如果实在不行可以上网查一下“Java播放音乐”,总有一个方式可以成功播放
  • 不知道图片、音乐素材放在哪里: 放在哪里都是没问题的,只要修改MyPanel.java中的静态常量即可,如果不知道正确的路径怎么写的话,以IDEA举例可以右键素材选择“copy path”即可

---------------------------------------------分割线----------------------------------------------------------------------

临近圣诞节,复习不下去了就突然想画一棵圣诞树,正好苹果那么贵买不起就用这个表达一下心意吧
思路:
计划用Java的Graphics画笔画一个圣诞树,用若干个20*20像素的正方形表示。

  1. 首先用C写了个大概的样子出来确定了主要的写法和逻辑
    圣诞树1.0
    我用Java画了一棵圣诞树_第1张图片
    运行出来感觉这样的太丑了,就决定下面两个三角形都不要尖的部分了

  2. 确定了写法后就用Java来写,还是要用到图形化界面,在一个面板里直接用fillRect()方法画正方形
    圣诞树2.0
    我用Java画了一棵圣诞树_第2张图片
    画完只有一个树有点没意思,就用fillRoundRect()在树尖上加上了小球

  3. 画到这里还是没那味儿,就打算弄个开关让小球会变色模拟发光。加一个按钮添加事件,用来触发一个时间事件,通过时间事件每隔2秒就改变一下小球的颜色,最后还加上了一个背景音乐
    圣诞树3.0
    我用Java画了一棵圣诞树_第3张图片

用Java画了一颗圣诞树

现在就有那味儿了

细节:

  • 画图形的时候要填充颜色,默认填充的Graphics画笔设置的颜色,可以用setColor()方法修改填充颜色,可以直接用Color类自带的几种颜色,但是实在是太丑了,所以可以选择先创建一个Color类的对象,然后打开PS选出喜欢的颜色查看这个颜色的RGB,然后设置该对象的RGB就可以得到这个颜色,最后将这个对象作为setColor()方法的参数即可。
Color red = new Color(255, 0, 0) ;
g.setColor(red) ;
  • 按钮设置为一个图片要用setIcon()方法,但是可能会有存在边框、背景颜色的问题,对于边框使用setBorder()方法,参数设置为null;对于背景颜色使用setContentAreaFilled()方法,参数设置为false
onOff.setBorder(null) ;					//去除边框 
onOff.setContentAreaFilled(false) ;		//去除默认背景颜色
  • 按钮图片大小不合适,首先要压缩图片,将图片放在ImageIcon类的一个对象中,然后使用setImage()方法,参数为icon.getImage().getScaledInstance(x,y, 0)
ImageIcon icon = new ImageIcon("OFF.png");
icon.setImage(icon.getImage().getScaledInstance(50,50, 0)) ;	//压缩图片大小
onOff = new JButton() ;
onOff.setIcon(icon) ;					//添加按钮图片

完整代码如下:
Start.java

package christmasTree;

public class Start {

	public static void main(String[] args) {
		new MyFrame() ;
	}

}

MyFrame.java

package christmasTree;

import javax.swing.JFrame;

public class MyFrame extends JFrame{
	MyPanel p ;
	MyFrame() {
		p = new MyPanel() ;
		add(p) ;
		setBounds(400, 200, 800, 800) ;
		setVisible(true) ;
		validate() ;
		setDefaultCloseOperation(MyFrame.EXIT_ON_CLOSE) ;
	}
}

MyPanel.java

package christmasTree;

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;

import javax.swing.*;

public class MyPanel extends JPanel implements ActionListener{
	int x, y ;		//坐标
	JButton onOff ;		//开关按钮
	Timer time ;		//触发时间事件
	boolean flag ;		//判断是开还是关
	boolean color ;		//控制动画
	File file = new File("music.wav") ;
	URL url = null;
	URI uri = null ;
	AudioClip clip = null;
	MyPanel() {
		setLayout(null);
		ImageIcon icon = new ImageIcon("OFF.png");
		icon.setImage(icon.getImage().getScaledInstance(50,50, 0)) ;	//压缩图片大小
		onOff = new JButton() ;
		onOff.addActionListener(this) ;
		onOff.setIcon(icon) ;					//添加按钮图片
		onOff.setBorder(null) ;					//去除边框 
		onOff.setContentAreaFilled(false) ;		//去除默认背景颜色
		onOff.setBounds(0, 0, 50, 50) ;
		add(onOff) ;
		flag = true ;
		color = true ;
		time = new Timer(300,this) ;
		time.stop() ;
		try {
			uri=file.toURI();	
			url = uri.toURL() ;
		} 
		catch (MalformedURLException e1) {}
		clip=Applet.newAudioClip(url);
	}
	public void paintComponent(Graphics g) {
		x = 380 ;
		y = 100 ;
		if(color) {
			ImageIcon image1 = new ImageIcon("2.png") ;
			g.drawImage(image1.getImage(), x-3, y-25, 28, 26, null) ;
		}
		else {
			ImageIcon image1 = new ImageIcon("1.png") ;
			g.drawImage(image1.getImage(), x-3, y-25, 25, 25, null) ;
		}
		Color red = new Color(255, 0, 0) ;
		Color yellow = new Color(255, 241, 0) ;		
		drawTree(1, 4, g) ;		//画第一个三角形		
		if(color) {
			drawDecoration(x+22, y-44, 6, yellow, g);	//画第一个三角形的黄色装饰
			drawDecoration(x, y-22, 8, red, g);		//画第一个三角形的红色装饰
		}
		else {
			drawDecoration(x+22, y-44, 6, red, g);	//画第一个三角形的黄色装饰
			drawDecoration(x, y-22, 8, yellow, g);		//画第一个三角形的红色装饰
		}
		x = 380-2*22;
		drawTree(3, 6, g) ;		//画第二个三角形
		if(color) {
			drawDecoration(x+22, y-44, 10, yellow, g);	//画第二个三角形的黄色装饰
			drawDecoration(x, y-22, 12, red, g);		//画第二个三角形的红色装饰
		}
		else {
			drawDecoration(x+22, y-44, 10, red, g);	//画第二个三角形的黄色装饰
			drawDecoration(x, y-22, 12, yellow, g);		//画第二个三角形的红色装饰
		}
		x = 380-4*22;
		drawTree(5, 8, g) ;		//画第三个三角形	
		if(color) {
			drawDecoration(x+22, y-44, 14, yellow, g);	//画第三个三角形的黄色装饰
			drawDecoration(x, y-22, 16, red, g);		//画第三个三角形的红色装饰
		}
		else {
			drawDecoration(x+22, y-44, 14, red, g);	//画第三个三角形的黄色装饰
			drawDecoration(x, y-22, 16, yellow, g);		//画第三个三角形的红色装饰
		}
		x = 380-1*22 ;
		drwaRoot(g) ;			//画树根
	} 
	void drawTree(int from, int to, Graphics g)	{		//画三角形
		Color c = new Color(9, 124, 37) ;
		g.setColor(c) ;
		for(int i=from; i<=to; i++) {	
			for(int j=0; j<(i*2-1); j++) {
				g.fillRect(x, y, 20, 20);
				x += 22 ;
			}
			x = 380-i*22 ;
			y += 22 ;
		}
	}
	void drawDecoration(int tx, int ty, int num, Color c, Graphics g) {		//画装饰
		g.setColor(c) ;
		g.fillRoundRect(tx, ty, 18, 18, 18, 18) ;		//画圆
		g.fillRoundRect(tx+num*22, ty, 18, 18, 18, 18) ;
	}
	void drwaRoot(Graphics g) {			//画树根
		Color c = new Color(131, 78, 0) ;
		g.setColor(c);;
		for(int i=0; i<4; i++) {	
			for(int j=0; j<3; j++) {
				g.fillRect(x, y, 20, 20);
				x += 22 ;
			}
			x = 380-1*22 ;
			y += 22 ;
		}
	}
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == onOff) {		//按钮事件
			if(flag) {		//开
				ImageIcon icon = new ImageIcon("ON.png");
				icon.setImage(icon.getImage().getScaledInstance(50,50, 0)) ;
				onOff.setIcon(icon) ;
				flag = false ;
				clip.loop();
				time.restart() ;
			}
			else {			//关
				ImageIcon icon = new ImageIcon("OFF.png");
				icon.setImage(icon.getImage().getScaledInstance(50,50, 0)) ;
				onOff.setIcon(icon) ;
				flag = true ;
				time.stop() ;
				clip.stop() ;
			}
		}
		else if(e.getSource() == time) {		//时间事件
			repaint() ;
			color = !color ;
		}
	}
}

总结:

祝大家圣诞快乐 ! ! ! !

你可能感兴趣的:(JAVA,小游戏,java)