每个人都有追求美的愿望,程序员在其他人眼中也许就是整天宅在寝室,厚厚的眼睛片,半个月不洗澡不洗头,可以用蓬头垢面来形容,但我觉得并不是这样,我觉的每个程序员都是艺术家,画家用笔来勾勒美丽的画面,音乐家用乐器奏出美丽的乐符,而我们程序员可以用代码来改变世界,用代码来画出美丽的画面,代码就是我们的绘画工具,我们画出的东西可以完爆艺术系的小男生小女生。下面向大家来抛出一个石头,希望广大IT工作者能在代码中找到乐趣,也变得有艺术气息一些,用自己的双手敲出震撼艺术系小女生的奇幻图片。
本人目前是一个刚刚涉足Java的初学者,前面做了一个画图板http://mntms.iteye.com/blog/1961426,因此也对Java类库中的绘图类和颜色类(Color)有了一定了解,今天想和大家分享一下在画平面图的基础上绘制一些简单的3D图片出来,在无聊的代码世界中让自己也眼前亮一下。下面介绍一下我制作的简单3D图画板。
这个画板一共分四个区域,每个区域可以画一种图片,点击相应区域内的按钮执行相应的动作,下面是运行的总体效果(点击全部按钮后):
点击删除渐变线按钮后效果如下:
接下来具体和大家分享一下实现方法和步奏(代码上已经详细注释):
package 简单的3D; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /** * 创建一个Draw3D的类,继承JFrame类,同时实现动作监听器,这样 * 就不需要再写一个监听器类,也不用传参(传画布对象)也不用生成监听器对象 */ public class Draw3D extends JFrame implements ActionListener { //入口函数 public static void main(String[] args) { //创建对象并调用类的初始化画板的方法 Draw3D draw = new Draw3D(); draw.init(); } //初始化画板的方法 public void init() { this.setTitle("3D画图板"); this.setSize(800,760); this.setDefaultCloseOperation(3); //使窗体的位置居中 this.setLocationRelativeTo(null); //将窗体的默认的布局取消,才能使用setBounds()方法将四个面板插入到指定的位置 this.setLayout(null); //将窗体分成四个区域(四个面板),并将每个面板的背景色设置成黑色,更能体现艺术的效果 jp1 = new JPanel(); jp1.setBackground(Color.black); jp1.setBounds(0,0,400,380); jp2 = new JPanel(); jp2.setBackground(Color.black); jp2.setBounds(400, 0, 400, 380); jp3 = new JPanel(); jp3.setBackground(Color.black); jp3.setBounds(0, 380, 400, 380); jp4 = new JPanel(); jp4.setBackground(Color.black); jp4.setBounds(400, 380,400, 380); //将每个面板的默认的布局取消,才能使用setBounds()方法插入相应的按钮组件 jp1.setLayout(null); jp2.setLayout(null); jp3.setLayout(null); jp4.setLayout(null); //给每个面板添加控制按钮,是用setBounds()将按钮组件安放到指定的位置 //此处使用setBounds()时要注意的是设置坐标的时候是相对于每块面板的,而不是整个窗体 JButton buC1 = new JButton("删除"); JButton buC2 = new JButton("删除"); JButton buC3 = new JButton("删除"); JButton buC4 = new JButton("删除"); //插入按钮的位置应该相对于每个面板,而不是整个窗体 buC1.setBounds(280, 10,80, 20); buC2.setBounds(280, 10,80, 20); buC3.setBounds(280, 10,80, 20); buC4.setBounds(280, 10,80, 20); JButton bu1 = new JButton("立体矩"); bu1.setBounds(80, 10,80, 20); jp1.add(bu1); jp1.add(buC1); JButton bu2 = new JButton("立体球"); bu2.setBounds(80, 10, 80, 20); jp2.add(bu2); jp2.add(buC2); JButton bu3 = new JButton("体三角"); bu3.setBounds(80, 10, 80, 20); jp3.add(bu3); jp3.add(buC3); JButton bu4 = new JButton("渐变线"); bu4.setBounds(80, 10, 80, 20); jp4.add(bu4); jp4.add(buC4); //给每个按钮添加命令 bu1.setActionCommand("3DRect"); bu2.setActionCommand("3DOval"); bu3.setActionCommand("Prim"); bu4.setActionCommand("litix"); //用数字分别代表每个画板上的删除操作clear1代表删除立体矩,clear2代表删除立体球 //clear3代表删除体三角,clear4代表删除渐变线 buC1.setActionCommand("clear1"); buC2.setActionCommand("clear2"); buC3.setActionCommand("clear3"); buC4.setActionCommand("clear4"); //给每个按钮添加监听器 bu1.addActionListener(this); bu2.addActionListener(this); bu3.addActionListener(this); bu4.addActionListener(this); buC1.addActionListener(this); buC2.addActionListener(this); buC3.addActionListener(this); buC4.addActionListener(this); //添加两条分界线,划分出四个区域 JButton bu6 = new JButton(); bu6.setBackground(Color.blue); bu6.setBounds(400, 5, 1, 780); JButton bu7 = new JButton(); bu7.setBackground(Color.blue); bu7.setBounds(3, 380, 780, 1); //将四块面板添加到窗体上 this.add(jp1); this.add(jp2); this.add(jp3); this.add(jp4); this.add(bu6); this.add(bu7); this.setVisible(true); //给每个面板获取画布对象,对应相应的面板 g1 = jp1.getGraphics(); g2 = jp2.getGraphics(); g3 = jp3.getGraphics(); g4 = jp4.getGraphics(); } /** * 重写动作监听器中的方法,实现点击不同的按钮执行相应的操作,通过e.getActionCommand() * 来判断点击的是哪个按钮并执行 */ public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("3DRect")) { //画3DRect使用循环绘制矩形,同时改变矩形的大小并改变颜色,实现3D的效果 for(int i = 0; i <=100; i++) { int m =i; g1.setColor(new Color(2*i,2*i,i)); g1.drawRect(50+m, 50+m, 250-2*m, 250-2*m); } } else if(e.getActionCommand().equals("3DOval")) { //画3DOval,使用fillOval()方法,同时循环改变大小和颜色 for(int m = 0; m <= 100; m++) { g2.setColor(new Color(m,2*m,m)); g2.fillOval(50+m, 50+m,250-2*m, 250-2*m); } } else if(e.getActionCommand().equals("Prim")) { //画体三角,首先做一个三角形,在此基础上循环,并改变颜色 for(int m = 0; m <= 250; m++) { g3.setColor(new Color(m,m,250)); g3.drawLine(200, 40+m, 20+m,300-m ); g3.setColor(new Color(m,250,m)); g3.drawLine(200, 40+m, 380-m, 300-m); g3.setColor(new Color(250,m,m)); g3.drawLine(380-m, 300-m,20+m , 300-m); } }else if(e.getActionCommand().equals("litix")) { //画渐变线,在一条的基础上实现长度和颜色的渐变 for(int m = 0; m <= 240; m++) { g4.setColor(new Color(20,m,250)); g4.drawLine(80+m,300-m,250-m ,300-m); } } //删除动作的实现,使用每个面板的背景色来作为绘图颜色绘制指定大小的fillRect图形,从而覆盖原来画的图形,实现删除 else if(e.getActionCommand().equals("clear1")) { g1.setColor(jp1.getBackground()); g1.fillRect(40, 40, 290, 290); }else if(e.getActionCommand().equals("clear2")) { g2.setColor(jp2.getBackground()); g2.fillRect(40, 40, 290, 290); }else if(e.getActionCommand().equals("clear3")) { g3.setColor(jp3.getBackground()); g3.fillRect(20, 40, 380, 290); }else if(e.getActionCommand().equals("clear4")) { g4.setColor(jp4.getBackground()); g4.fillRect(10, 40, 380, 290); } } //将画布对象和面板对象设置成Draw3D类的私有属性,实现在类中不同方法中的使用 private Graphics g1; private Graphics g2; private Graphics g3; private Graphics g4; private JPanel jp1; private JPanel jp2; private JPanel jp3; private JPanel jp4; }
如果不给每个面板设置背景色,绘制的效果如下:
虽然实现的方法很简单,但是还是希望初学者们或者已经学有所成的老程序员们去做一做,因为从中我们能感受到Java给我们带来的乐趣,我们用代码也可以绘制出迷人的图画,只要敢于尝试,敢于想象,当自己面前出现奇幻的图像时还是会被自己感动的,我觉得作为初学者的我们就要先从java中找到学习它的乐趣,那样我们才会有坚持下去的动力,培养自己的兴趣很重要,兴趣是最好的老师。
相关推荐
镜心小屌丝聊天机器人,是一款自足行为软件,试试还不错,你问什么他答什么,就是有时候有点让你想象不到。
在Android应用开发中,"Retrofit+Rxjava+MVP组合屌丝APP"是一个典型的技术栈,用于构建高效、可维护的网络请求和数据管理框架。这个APP结合了多种热门技术,使得开发者能够轻松地处理网络接口调用、数据流管理和用户...
3. **自定义功能**:除了基本的布局和样式,我们还可以添加自定义菜单、小工具区域、自定义背景和头像等功能。这需要修改functions.php文件,注册和调用相应的WordPress函数。 4. **SEO优化**:“屌丝青年网”的SEO...
在IT行业中,程序员通常被视为技术宅的代表,他们的世界充满了代码和逻辑,但这并不意味着他们缺乏浪漫。"屌丝程序员向女神表白专用神器"这个主题恰好揭示了编程与情感表达之间的有趣结合,展示了程序员的独特创意。...
在IT领域,重装系统是一项常见的操作,尤其对于那些不熟悉技术的“屌丝”用户来说,可能是一项挑战。然而,随着技术的发展,现在有了许多简单易用的一键重装系统工具,使得这个过程变得相对轻松。本文将详细介绍如何...
【标题】"小游戏源码-真屌丝鉴定.rar" 提供的是一个小型游戏的源代码,这通常意味着我们可以深入学习和理解游戏开发的基本原理。源码是软件开发的核心部分,它包含了程序的所有指令和逻辑,是程序员用编程语言编写的...
(糗事百科、暴走漫画)屌丝程序员如何一个人打造日PV百万的网站架构
【标题】"最新网址大全源码,好123屌丝版网址导航"涉及到的是一个网站源码项目,主要用于创建一个集成了多种常用网址的导航站点,类似于知名的"好123"导航站,主要服务于广大用户,方便他们快速访问互联网上的热门和...
在SEO领域,屌丝们想要让网站排名上升,需要采取一系列的策略和技巧。以下是一些关键的站内调整和站外优化方法: 1. **站内调整与策略** - **标题关键词优化**:每个页面的title标签应该独特且包含目标关键词,...
【论文】视频网站自制剧的经营战略分析-以搜狐《屌丝男士》为例.docx
《H5小游戏源码:真屌丝鉴定》是一款基于HTML5技术开发的轻量级互动游戏,其源代码提供了一次深入理解H5游戏开发的机会。H5小游戏源码是近年来随着移动互联网的快速发展而逐渐热门的学习和实践领域,它涉及到的技术...
【论文】视频网站自制剧的经营战略分析-以搜狐《屌丝男士》为例正文终稿.docx
老冀重量级小博客4.99黑色屌丝版 优势: 1.抛弃了数据库改为txt文档 2.抛弃了图片,提高了网站打开数度 3.抛弃了后台功能,提高了网站的安全性,ftp实现文章更新,要后台就弄个大马 4.经测试完美兼容google搜索引擎 ...
【标题】"小游戏源码-随意门(屌丝版).rar" 暗示了这是一个包含了小型游戏源代码的压缩文件,其中的游戏被称为"随意门",可能是一个简单的冒险或者解谜类游戏,而"屌丝版"可能是开发者对其定位或幽默的自嘲,暗示这...
《H5小游戏源码 随意门(屌丝版)》是一个提供给开发者学习和参考的资源,主要用于理解H5游戏开发的基本原理和技术。H5,即HTML5,是一种超文本标记语言,它的出现极大地提升了网页内容的多媒体表现力,尤其是对于...
《Java2048屌丝逆袭版》是一款基于Java编程语言实现的2048游戏,它在原版2048的基础上可能增加了一些趣味性或者挑战性的元素,使得玩家能够体验到更加丰富的游戏体验。2048游戏是由Gabriele Cirulli在2014年开发的一...
蹭网屌丝专用WIFI三神 蹭网屌丝专用WIFI三神器