`
心若吾心
  • 浏览: 19102 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

Java——简单画图板的制作

阅读更多
[color=darkblue]Java——简单画图板的制作
现在我们用一些比较基础的Swing包中的类和监听器来完成一个简单画图板的制作。
首先:画图板需要图形化的界面,界面上还需要有按钮,标签等组件。
其次:在按下相应按钮时应该用监听器来接收信息,告诉程序要干什么。
最后:需要把所画图形重绘出来。避免最小化或移动窗口后所画图形的缓存被清理掉。


现在,我们来做一个画图板的主界面,可以把它放在一个类中:我们可以叫它Frame类,让它继承Jframe类,拥有其属性和方法
然后在这个Frame对象上添加我们所需要的组件,假设我们需要画图板能画出直线,立方体。(1):
我们可以添加两个按钮。使得我们点选直线按钮时能画出直线。点选矩形按钮时能画出立方体。我们还需要一个可以选择颜色的组件。这里可以用JcolorChooser中的showDialog方法来进行颜色选择。
(2):我们还需要在界面上加入画布对象,这样才可以绘画。
(3):我们还需要在画布上加入监听器对象,在按钮上加入监听器对象。
(4):为了完成重绘,我们需要把画好的形状对象存入一个队列中,然后重写Jframe中的paint方法(父类的paint方法是把所画图形存在缓存中。当窗口改变时清空缓存)。重写paint。使窗口改变时重绘存入队列的形状对象。

首先,我们先来做一个画图板界面:
package DrawTest;
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JButton;

/**
* 主界面类,继承JFrame
*
* @author Administrator
*
*/
public class Frame extends javax.swing.JFrame {

//创建用来存储形状对象的容器
public static ShapeList<Shape> shapes=new ShapeList<Shape>();


/**
* 创建画板界面的方法
*/
public void InitFrame() {
/**
* 设置窗口标题和大小
*/
this.setTitle("我的画板程序");
this.setSize(500, 600);
/**
* 设置布局为流式布局,1代表居中
*/
FlowLayout layout=new FlowLayout(1);
//将布局对象添加到窗口上
this.setLayout(layout);
/**
* 创建几个按钮
*/
javax.swing.JButton bu1=new javax.swing.JButton("直线");
javax.swing.JButton bu2=new javax.swing.JButton("矩形");
javax.swing.JButton bu3=new javax.swing.JButton("颜色");
/**
* 将按钮添加到窗体上
*/
this.add(bu1);
this.add(bu2);
this.add(bu3);
//设置窗口为可见
this.setVisible(true);
//添加画布到窗体上
Graphics g=this.getGraphics();

//添加带画布的监听器对象
Listener li=new Listener(g);

//给窗体加上监听器
this.addMouseListener(li);
//给按钮加上监听器
bu1.addActionListener(li);
bu2.addActionListener(li);
bu3.addActionListener(li);

}
这样就完成了画图板界面的创建;

接下来就要实施按钮功能了。使能在用户点击了直线按钮后可以在画布上画直线,和点击了矩形后能载画布上画立方体以及点击颜色按钮能选择颜色的操作。这就是监听器要完成的任务。
我们新建另一个类作为监听器类,我们叫他Listener类;鉴于我们需要在画布上用鼠标能作图,我们需要用到鼠标监听器。而且需要在点击按钮时能依据按钮上文字判断操作,我们需要动作监听器。于是我们让Listener继承MouseListener 和ActionListener两个接口,由于是接口,它们里面的方法都要被实现。
当我们把Listener的对象添加于Frame对象上后,就可以对Frame进行监听了。

代码:
package DrawTest;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JColorChooser;

/**
* 监听器类,继承鼠标监听器和动作监听器接口
*
* @author Administrator
*
*/
public class Listener implements MouseListener, ActionListener {

private Graphics gr;
private int x1, x2, y1, y2;
private Color color;
private String text = "Line";
//带画布对象的构造方法,将Frame中的画布传入监听器对象
public Listener(Graphics gr) {
this.gr = gr;
}

/**
* 鼠标按下时的方法,获得鼠标按下时的坐标
*/
public void mousePressed(MouseEvent e) {
// 将鼠标按下时的坐标赋值给x1,y1
x1 = e.getX();
y1 = e.getY();
}

/**
* 鼠标离开时的方法,获得鼠标离开时的坐标。并画出图形
*/
public void mouseReleased(MouseEvent e) {
// 将鼠标释放时的坐标赋值给x2,y2
x2 = e.getX();
y2 = e.getY();
// 设置作画颜色 在监听器类中写出getColor方法
gr.setColor(getColor());
// 当要画直线的时候
if (text.equals("直线")) {
// 实例化一个直线对象 (接下来讲述)
Shape l = new Line();
// 给直线对象属性赋值
l.x1 = x1;
l.x2 = x2;
l.y1 = y1;
l.y2 = y2;
l.color=color;
// 调用画直线方法
l.draw(gr);
//将画好对象放入队列保存
Frame.shapes.add(l);

}
else if (text.equals("矩形")) {
// 实例化一个矩形对象
Shape r = new Rect();
// 给矩形对象属性赋值
r.x1 = x1;
r.x2 = x2;
r.y1 = y1;
r.y2 = y2;
r.color=color;
// 调用画直线方法
r.draw(gr);

//将画好对象放入队列保存
Frame.shapes.add(r);
}
}

public void mouseClicked(MouseEvent e) {

}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

// ********************************************************************************

/**
* 定义选择颜色的方法
*/
public void actionPerformed(ActionEvent e) {
// 将事件源的文本赋值给text、
text = e.getActionCommand();
// 判断事件源的文本
if (text.equals("颜色")) {
// 将选择的颜色赋值给color
color = JColorChooser.showDialog(null, "Choose Color", Color.black);
}

}

// *********************************************************************************
/**
* 得到颜色的方法
*/
public Color getColor() {
// 返回颜色的值
return color;
}
}

上面说到的监听器中使用了Shape对象,这是用来绘画形状的一个抽象类。它可以具体由Line和Rect实现。让Line跟Rect继承它,并实现其中draw方法即可。代码如下:
package DrawTest;
import java.awt.Color;
import java.awt.Graphics;

/**
* 形状类,抽象类
* @author Administrator
*
*/
public abstract class Shape {
/**
* 属性:点坐标
*/
int x1,x2,y1,y2;
/**
* 属性:颜色
*/
    Color color;
    /**
     * 绘制形状的方法
     */
    public abstract void draw(Graphics g);
}

以上是Shape类具有的方法和属性,现在具体的实现,我们的画图板可以绘画直线和矩形。于是我们用Line类和Rect类来继承Shape类。分别实现draw方法,代码如下:

Line类
package DrawTest;
import java.awt.Graphics;
/**
* 绘制直线对象的方法
*
* @author Administrator
*
*/
public class Line extends Shape {

//实现父类中的draw方法
public void draw(Graphics g) {
//设置画布颜色为所选颜色
g.setColor(color);
//调用画直线方法
g.drawLine(x1, y1, x2, y2);
}
}
Rect类:
package DrawTest;

import java.awt.Graphics;

/**
* 定义一个Rect类继承Shape类
*
* @author Administrator
*
*/
public class Rect extends Shape {

/**
* 实现父类抽象方法
*/
public void draw(Graphics g) {
g.setColor(color);
g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y2 - y1));
}
}

接下来就是要实现重绘,这需要一个队列来保存所画的形状,我们新建一个ShapeList<E>类来保存形状对象。这里用到了泛型,因为我们要用它来保存不同类的对象。

ShapeList内需要有能把元素加到队列中的方法,还需要有根据下标得到队列对象的方法,此外,还要有获得队列大小的方法。下面来实现ShapeList类

代码 :
package DrawTest;
/**
* 定义泛型队列类,用来保存形状对象
* @author Administrator
*
* @param <E>
*/
public class ShapeList<E> {
//定义一个数组用来保存形状对象
private Object[] Shapes=new Object[0];

public void add(E e){
//新数组,长度较原数组加一
Object[] Shapesnew=new Object[Shapes.length+1];
//将新元素加入新数组末尾
Shapesnew[Shapes.length]=e;
//将原数组元素复制到新数组中
for(int i=0;i<Shapes.length;i++){
Shapesnew[i]=Shapes[i];
}
//将新数组赋值给原数组
Shapes=Shapesnew;
}
/**
* 得到队列长度
* @return
*/
public int size(){
return Shapes.length;
}

//得到队列对象
public E getShape(int index){
E sh=(E)Shapes[index];
return sh;
}
}

最后我们需要做的就是能实现重绘,就是一个存入形状对象,取出形状对象,画出所取的形状对象的过程。这要我们重写JFrame类(也就是Frame的父类)中的paint方法:
代码如下:
/**
* 重写父类的paint方法
*/
public void paint(Graphics g){
//调用父类的方法来正确绘制窗体
super.paint(g);
//遍历形状对象
for(int i=0;i< shapes.size();i++){
//取得形状对象
Shape sh=shapes.getShape(i);
//绘制形状对象
sh.draw(g);
}
}

然后我们再写一个Main类作为程序入口,创建一个Frame对象并调用方法,就可以运行画图板程序了。
package DrawTest;
/**
* 程序入口
* @author Administrator
*
*/
public class Main {
public static void main(String[] args) {
Frame f=new Frame();
f.InitFrame();
}
}

[color=darkblue]
[/color][/color]
分享到:
评论

相关推荐

    034-基于AT89C52的矩阵键盘扫描proteus仿真设计.rar

    51单片机

    双级式储能模型,可做充放电转以及低电压故障穿越,含有负序抑制模块,可做对称故障与不对称故障

    双级式储能模型,可做充放电转以及低电压故障穿越,含有负序抑制模块,可做对称故障与不对称故障

    郑州升达大学2024-2025第一学期计算机视觉课程期末试卷,

    郑州升达大学2024-2025第一学期计算机视觉课程期末试卷,原版。配套教材为《OpenCV计算机视觉基础教程》夏帮贵主编。

    金工实习线上考试线切割课后试题.docx

    线切割课后试题

    网络原理课程设计【校园网规划】+思科模拟器,包含pkt文件及完整实验报告,附录含有源码

    目录 摘 要 1 一、设计任务概述 3 1.1 设计目的 3 1.2 项目任务和要求 3 1.3 参考资料 3 二、项目开发环境 4 三、项目需求分析 5 四、 项目设计和实现 5 4.1 总体设计 5 4.2 功能设计 6 4.3 系统实现 7 五、系统运行和测试 12 六、设计总结 15 七、附录 16 7.1 程序清单 16 7.2 其他需要说明的内容 23。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    智慧物联网系统发展战略研究

    智慧物联网系统发展战略研究

    基于springboot+vue的大创管理系统2(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    基于springboot+vue的网上点餐系统(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    直流电机的电枢回路串电阻启动的计算

    电机与拖动技术三级项目报告,直流电动机是电机的主要类型之一,具有调速范围广、调速特性平滑、过载能力强等优点,在生产生活中具有广泛的应用。此次课程项目阐述了直流电动机的结构、应用、并着重对电枢回路串电阻分级启动进行深入研究,MATLAB仿真软件对直流电动机分级启动进行仿真。

    Java Spring Boot实现基于URL + IP访问频率限制(源代码)

    详细说明:https://blog.csdn.net/a342874650/article/details/144989766 在 Web 应用中,恶意用户可能会通过频繁刷新接口或进行暴力请求来攻击系统,导致服务器负载过高或服务不可用。为了应对这一问题,本文将详细介绍如何使用 Spring Boot 结合拦截器(Interceptor)和 Redis 来实现基于 URL 和 IP 的访问频率限制。具体实现包括拦截器拦截请求、Redis 存储访问记录、检测访问频率并在达到限制时禁用 IP 的完整过程。通过本文的详细实现过程和完整源代码,读者可以快速掌握如何在自己的项目中应用这一机制来增强系统的安全性和稳定性。

    JavaEE核心技术:Web框架与持久层设计方案解析(主观题考试题库)

    内容概要:本文详细介绍了JavaEE核心技术,涵盖多个重要的Web框架和持久层技术,以及其应用场景和实施方案。具体内容包括:①Struts框架的特点和功能,特别是其对MVC架构的支持,以及如何应用于薪资管理系统;②MVC架构的基本概念和如何通过JSP、JavaBean及Servlet实现成绩管理系统;③Spring IoC容器的工作原理,强调其控制反转和依赖注入功能,展示了整合Struts和JPA的具体案例,如通讯管理系统Web层设计方案;④Spring MVC结构及其XML配置方法,并提出一种针对图书管理系统的Spring MVC实现思路;⑤深入探讨Spring AOP原理,介绍如何使用XML配置进行统一事务处理的应用方案;⑥分析Hibernate核心接口及设备管理系统持久层设计方案;⑦整合Hibernate和Spring IoC实现的成绩管理系统持久层设计方案。 适合人群:具备一定Java基础的初、中级JavaEE开发者,对JavaWeb开发有兴趣的学习者。 使用场景及目标:①帮助开发者理解JavaEE关键技术和框架的实际运用,提高项目开发技能;②指导实际项目的架构设计和技术选型;③促进团队协作,提高代码复用性和维护效率。 阅读建议:建议读者根据自身经验和兴趣选择重点章节仔细研读,并结合实际情况尝试实践,逐步掌握各知识点。此外,还应该结合最新的API文档和技术论坛资料不断跟进更新。

    easy-interceptor修改请求头和响应头.zip

    easy-interceptor修改请求头和响应头.zip

    Prime-Series-Level-1.z10

    Prime_Series_Level-1.z10 别下,这个是分卷压缩,笔者用来备份的

    基于springboot+vue的教师工作量管理系统(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    CST0402B+跟岗实习提交资料.zip

    CST0402B+跟岗实习提交资料.zip

    基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)

    基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目),个人大三大设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为毕业设计、课程设计、期末大作业。 基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文档说明(高分项目)基于yolov5的医学影像肺结节检测项目源码+文

    循环法和对数法计算利息

    本金1W利息0.0325,几年能double?

    matlab机械臂关节空间轨迹规划,3-5-3分段多项式插值法,六自由度机械臂,该算法可运用到仿真建模机械臂上实时运动,可视化轨迹,有角度,速度,加速度仿真曲线 也可以有单独角度,速度,加速度仿真曲

    matlab机械臂关节空间轨迹规划,3-5-3分段多项式插值法,六自由度机械臂,该算法可运用到仿真建模机械臂上实时运动,可视化轨迹,有角度,速度,加速度仿真曲线。 也可以有单独角度,速度,加速度仿真曲线。 可自行更程序中机械臂与点的参数。 谢谢大家 (程序中均为弧度制参数)353混合多项式插值

    2011-2023年各省金融监管水平数据(含原始数据+计算过程+计算结果)

    2011-2023年各省金融监管水平数据(含原始数据+计算过程+计算结果) 1、时间:2011-2023年 2、来源:国家统计J、统计NJ 3、指标:金融业增加值、金融监管支出、金融监管水平 4、计算方法:金融监管水平=金融监管支出/金融业增加值

    简易手写汉字表.pdf

    本表名称为简易手写识字表,收录了21000多个汉字,每个汉字后面附上了简易手写笔画和输入编码。独体字是一个主笔画和一个字母编码,双码字是两个主笔画组合和两个字母编码,多码字是两个主笔画组合和三个字母编码。可用于识字、简易手写和大键盘汉字输入等参考。

Global site tag (gtag.js) - Google Analytics