临近圣诞节,复习不下去了就突然想画一棵圣诞树,正好苹果那么贵买不起就用这个表达一下心意吧
思路:
计划用Java的Graphics画笔画一个圣诞树,用若干个20*20像素的正方形表示。
-
首先用C写了个大概的样子出来确定了主要的写法和逻辑
圣诞树1.0
运行出来感觉这样的太丑了,就决定下面两个三角形都不要尖的部分了 -
确定了写法后就用Java来写,还是要用到图形化界面,在一个面板里直接用fillRect()方法画正方形
圣诞树2.0
画完只有一个树有点没意思,就用fillRoundRect()在树尖上加上了小球 -
画到这里还是没那味儿,就打算弄个开关让小球会变色模拟发光。加一个按钮添加事件,用来触发一个时间事件,通过时间事件每隔2秒就改变一下小球的颜色,最后还加上了一个背景音乐
圣诞树3.0
[video(video-uhEZX1XW-1577196014760)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=80522682)(image-https://ss.csdn.net/p?http://i0.hdslb.com/bfs/archive/6130b4b6d0a038f8c317ba6e5a0cbe8d684a3a34.jpg)(title-用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 ;
}
}
}
总结:
扫描二维码关注公众号,回复:
8970022 查看本文章