实现画板的基本思路: 1.设计画板的布局,分为三块,左边放工具按钮,下边放颜色按钮,中间放画图区域
2.实现三块区域的功能,用一个面板放置工具按钮,用一个面板放置颜色按钮,用一个面板作为画图区域
3.设置监听器方法,在工具按钮面板类里设置获取工具按钮文本内容的动作监听器方法,在颜色按钮面板类里设置获取每个颜色按钮背景色的动作监听器方法
对画图面板设置鼠标监听器方法使鼠标可以在该区域画图
画板实现具体步骤:
1.写出界面,把窗体分为三个区域,工具区,颜色区,画图区;每个区用一个面板实现
1).写出一个窗体界面
代码:
public DrawingBorder extends JFrame{//定义一个DrawingBorder类继承自JFrame类
public static void main(String args[]){//程序入口
DrawingBorder db=new DrawingBorder();//实例化DrawingBorder类的一个对象db
db.init();//调用对象db中的方法init()}
public void init(){//定义一个初始化主窗体的方法init()
this.setTitle("画板");//设置窗体的标题为“画板”
this.setSize(600,500);//设置窗体的大小为600*500像素
this.setDefaultCloseOperation(3);//设置点击关闭按钮时关闭窗体
this.setLocationRelativeTo(null);//设置窗体居中显示
this.setVisible(true);//设置窗体可见
}
}
2).把画图工具放到一个面板上,再把添加了工具的面板添加到一个面板中
代码:
public class ToolsPanel extends JPanel{//定义一个放置工具面板的面板类ToolsPanel继承自JPanel
public ToolsPanel(){//定义类ToolsPanel的一个无参构造方法,调用方法init()
init();
}
public void init(){//定义一个初始化工具面板的方法
JPanel jp=new JPanel();//实例化一个新面板用来放置工具按钮
jp.setLayout(new GridLayout(3,2,2,2));//设置新面板对象jp的布局为网格布局,布局为3行2列,按钮间距为2*2像素
public String [] arry={"直线","矩形","圆","填充圆","多边形","五角星"};//定义一个数组arry[]来存放按钮的文本内容
for(int i=0;i<arry.Length;i++){//用一个循环来实例化按钮并设置按钮的文本内容
JButton jb=new JButton(arry[i]);
jp.add(jb);}
}this.add(jp);//把存放工具按钮的面板添加到面板ToolsPanel中
}
3).把颜色放到一个面板上,再把颜色的面板加到另一个面板去
public class ColorPanel extends JPanel{//定义一个存放颜色面板的面板类ColerPanel继承自JPanel类
public ColorPanel(){//定义类ColorPanel的一个无参构造方法,调用方法init()
init();}
public void init(){//定义一个初始化ColorPanel 面板的方法
this.setBackground(Color.GRAY);//设置面板的背景色
JPanel cjp=new JPanel();//实例化一个新面板cjp
cjp.setLayout(new GridLayout(2,6,2,2));//设置面板cjp的布局为网格布局,为2行6列,按钮间距为2*2像素
public Color arry[]= {Color.black,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GRAY,Color.GREEN,
Color.LIGHT_GRAY,Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.YELLOW};};//定义一个数组arry[]存放按钮的背景色
for(int i=0;i<){用一个循环来实例化按钮并为按钮设置背景色
JButton cjb=new JButton();
cjb.setBackground(arry[i]);
cjp.add(cjb);}
}
this.add(cjp);把面板cjp添加到ColorPanel面板上
}
4).新建一个画图的面板
代码:
public class DrawingPanel extends JPanel{//定义一个画图面板类DrawingPanel继承自JPanel
public DrawingPanel(){//定义类DrawingPanel的一个无参构造器方法,调用方法init()
init();}
public void init(){//定义初始化面板的方法
this.setBackground(Color.WHITE);}//设置面板的背景色
}
5).把工具面板、颜色面板和画图面板添加到窗体上,布局使用边框布局
代码:public DrawingBorder extends JFrame{//定义一个DrawingBorder类继承自JFrame类
public static void main(String args[]){
//程序入口
DrawingBorder db=new DrawingBorder();
//实例化DrawingBorder类的一个对象db
db.init();//调用对象db中的方法init()}
public void init(){
//定义一个初始化主窗体的方法init()
this.setTitle("画板");
//设置窗体的标题为“画板”
this.setSize(600,500);
//设置窗体的大小为600*500像素
this.setDefaultCloseOperation(3);
//设置点击关闭按钮时关闭窗体
this.setLocationRelativeTo(null);
//设置窗体居中显示
this.setVisible(true);//设置窗体可见
ToolsPanel tp=new ToolsPanel();//实例化工具面板类ToolsPanel的一个对象tp
this.add(tp,BorderLayout.WEST);//把tp添加到窗体的西边
ColorPanel cp=new ColorPanel();//实例化颜色面板类ColorPanel的一个对象cp
this.add(cp,BorderLayout.SOUTH);//把cp添加到窗体的南边
DrawingPanel dp=new DrawingPanel();//实例化画图面板类DrawingPanel的对dp
this.add(dp,BorderLayout.CENTER);//把dp添加到窗体的中间
}
}
2.给工具面板中的按钮添加监听器方法,绑定处理类的对象,获取到按钮的文本
代码:public class ToolsPanel extends JPanel{
public ToolsPanel(){
init();
}
public String type="直线";
public void init(){
JPanel jp=new JPanel();
jp.setLayout(new GridLayout(3,2,2,2));
public String [] arry={"直线","矩形","圆","填充圆","多边形","五角星"};
ActionListener a1=new ActionListener(){//实例化一个监听器a1
public void actionPerformed(ActionEvent e){
type=e.getActioncommand();//获取动作按钮的文本内容}
};
for(int i=0;i<arry.Length;i++){//用循环把每个按钮都添加一个动作监听器a1
JButton jb=new JButton(arry[i]);
jb.addActionListener(a1);
jp.add(jb);
}
this.add(jp);
}
}
3.给颜色面板中的颜色按钮添加监听器方法,绑定处理类的对象,获取到按钮的颜色
代码:public class ColorPanel extends JPanel{
public ColorPanel(){
init();}
public Color color=Color.BLACK;
public void init(){
this.setBackground(Color.GRAY);
JPanel cjp=new JPanel();
cjp.setLayout(new GridLayout(2,6,2,2));
public Color arry[]= {Color.black,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GRAY,Color.GREEN,
Color.LIGHT_GRAY,Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.YELLOW};};
ActionListener a2=new ActionListener(){//实例化一个动作监听器a2
public void actionPerformed(ActionEvent e){
JButton bt = (JButton) e.getSource();//获取事件源
color=bt.getBackground();//把按钮的背景色存入变量color中}};
for(int i=0;i<){
JButton cjb=new JButton();
cjb.setBackground(arry[i]);
cjp.add(cjb);}
}
this.add(cjp);
}
4.设置一个画图的鼠标监听器
代码:public class DrawingListener implements MouseListener, MouseMotionListener {//实例化一个监听器DrawingListener继承自MouseListener和MouseMotionListener
public int x1, x2, y1, y2;//定义存放鼠标动作的坐标
public ToolsPanel tp;
public ColorPanel cp;
public Graphics g;
private boolean state = true;定义一个布尔变量state并赋值为true
private int startX,startY,endX,endY;
public DrawingListener(ToolsPanel tp, ColorPanel cp, Graphics g) {//定义类DrawingListener的一个有参构造器,传递对象tp,cp,g
this.tp =tp;
this.cp = cp;
this.g = g;
}
public void mouseClicked(MouseEvent e) {
if (tp.type.equals("多边形")) {//如果用户选择的是多边形,则执行画多边形的任务
x2 = e.getX();
y2 = e.getY();
//获得鼠标点击的坐标
if (endX == x2 && endY == y2) {
//若鼠标点击的点与画的前一条直线的结束点坐标相同,则连接第一点与鼠标点击的点
g.drawLine(startX, startY, x2, y2);
state = true;
} else {//若鼠标点击的点与画的前一条之下的结束点坐标不同,则连接前一条线的结束点
g.drawLine(endX, endY, x2, y2);
}
endX = x2;
endY = y2;
}
}
public void mousePressed(MouseEvent e) {//获取鼠标按下时的坐标
x1 = e.getX();
y1 = e.getY();
}
public void mouseReleased(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();//获取鼠标释放时的坐标
g.setColor(cp.color);//设置画图的颜色
if (tp.type.equals("直线")) {//若用户点击的按钮是直线,则执行画直线的任务
g.drawLine(x1, y1, x2, y2);
} else if (tp.type.equals("圆")) {//若用户点击的按钮是圆,则执行画圆的任务
g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
Math.abs(y1 - y2));
} else if (tp.type.equals("矩形")) {//若用户点击的按钮是矩形,则执行画矩形的任务
g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
Math.abs(y1 - y2));
} else if tp.type.equals("填充圆")) {//若用户点击的按钮是填充圆,则执行画填充圆的任务
g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
Math.abs(y1 - y2));
g.fillOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
Math.abs(y1 - y2));
} else if (tp.type.equals("圆角矩形")) {//若用户点击的按钮是圆角矩形,则执行画圆角矩形的任务
g.drawRoundRect(Math.min(x1, x2), Math.min(y1, y2),
Math.abs(x1 - x2), Math.abs(y1 - y2), 20, 20);
} else if (tp.type.equals("多边形")) {//若用户点击的按钮是多边形,则执行画多边形的任务
if(state){//若state=true则话一条直线
g.drawLine(x1, y1, x2, y2);
state = false;//把state的值赋为false
startX = x1;//把x1赋值给startX
startY = y1;//把y1赋值给startY
endX = x2;//把x2赋值给endX
endY = y2;//把y2赋值给endY
}
}
}
public void mouseDragged(MouseEvent e) {
g.setColor(cp.color);//设置画图的颜色
if (tp.type.equals("刷子")) {// 如果用户选择是刷子,则执行绘制刷子的任务
// 获取鼠标在拖动过程中的坐标
x2 = e.getX();
y2 = e.getY();
// 将Graphics的对象强制转型为Graphics2D
Graphics2D g2d = (Graphics2D) g;
// 设置线条的粗细
g2d.setStroke(new BasicStroke(10));
// 用g2d去绘制刷子
g2d.drawLine(x1, y1, x2, y2);
// 交换坐标,这样才能绘制出曲线
x1 = x2;
y1 = y2;
// 设置线条的粗细
g2d.setStroke(new BasicStroke(1));
} else if (tp.type.equals("喷枪")) {// 如果用户选择是喷枪,则执行绘制喷枪的任务
// 获取鼠标在拖动过程中的坐标
x2 = e.getX();
y2 = e.getY();
// 表示在拖动的过程中,只要获取到了坐标,就会随机在该坐标位置画十个点
for (int i = 0; i < 10; i++) {
// 随机获取一个x值
int x = rand.nextInt(8);
// 随机获取一个y值
int y = rand.nextInt(8);
// 开始画点
g.drawLine(x2 + x, y2 + y, x2 + x, y2 + y);
}
} else if (tp.type.equals("铅笔")) {//若用户选择的按钮是铅笔,则执行铅笔的任务
x2 = e.getX();
y2 = e.getY();//获取鼠标拖动过程中的坐标
g.drawLine(x1, y1, x2, y2);
x1 = x2;
y1 = y2;//交换坐标
} else if (tp.type.equals("橡皮擦")) {//若用户选择的按钮是橡皮擦,则执行橡皮擦的任务
g.setColor(Color.WHITE);//设置画图的颜色为白色
x2 = e.getX();
y2 = e.getY();//获取鼠标拖动过程中的坐标
Graphics2D g2d = (Graphics2D) g;//将Graphics的对象强制转型为Graphics2D的对象
g2d.setStroke(new BasicStroke(10));//设置线条的粗细
g2d.drawLine(x1, y1, x2, y2);
x1 = x2;
y1 = y2;//交换坐标
g2d.setStroke(new BasicStroke(1));//设置线条的粗细
} else if (tp.type.equals("曲线")) {//若用户选择的按钮是曲线,则执行绘制曲线的任务
x2 = e.getX();
y2 = e.getY();//获取鼠标拖动过程中的坐标
g.drawLine(x1, y1, x2, y2);
x1 = x2;
y1 = y2;//交换坐标
}
}
// 实例化一个随机数类的对象
private Random rand = new Random();
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
}
}
5.把鼠标监听器绑定处理类的对象,实现画图功能
代码:public DrawingBorder extends JFrame{
public static void main(String args[]){
DrawingBorder db=new DrawingBorder();
db.init();}
public void init(){
this.setTitle("画板");
this.setSize(600,500);
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setVisible(true);
ToolsPanel tp=new ToolsPanel();
this.add(tp,BorderLayout.WEST);
ColorPanel cp=new ColorPanel();
this.add(cp,BorderLayout.SOUTH);
DrawingPanel dp=new DrawingPanel();
this.add(dp,BorderLayout.CENTER);
Graphics g = dp.getGraphics();//实例化一个画图的方法对象g
DrawingListener a3 = new DrawingListener(tp, cp, g);//实例监听器DrawingListener的对象a3
dp.addMouseListener(a3);//把鼠标监听器添加到画图区域
dp.addMouseMotionListener(a3);//把鼠标移动监听器添加到画图区域
}
}
分享到:
相关推荐
这篇博客的文章链接虽然无法直接查看,但从标题我们可以推测它可能是关于Java Canvas的使用经验和技巧的总结。 首先,Java中的Canvas类是一个非常基础的绘图接口,它没有内置的绘图功能,需要开发者自行实现。你...
Protel99SE是一款经典且广泛使用的电子设计自动化(EDA)软件,主要用于电路原理图设计和PCB(印制电路板)布局布线。本文将深入解析protel99SE画板的简明流程...希望这份简明总结能为你的PCB设计之路提供有力的支持。
在给定的"简单画板开发总结"中,虽然具体使用的编程语言和库未明确指出,但我们可以假设它涉及到的是基本的绘图API的使用。 1. **绘图API**:无论是哪种语言,绘图API都是画板的核心。例如,HTML5的Canvas API提供...
【标题】:“画板保存总结”涉及的知识点主要围绕图形绘制、事件监听和文件操作,这些是计算机图形学和Java编程中的基础概念。 【描述】虽然没有提供具体的内容,但根据“画板保存总结”这一标题,我们可以推测这篇...
总结来说,"几何画板加自定义工具包.zip"不仅提供了一个基础的几何画板试用环境,更赠送了一份海量的自定义工具集,使得数学教学和学习变得更加生动有趣。无论是初学者还是经验丰富的用户,都能从中找到适合自己的...
### 高频PCB板设计心得总结 #### 一、前言 随着电子产品向着更高频率、更高性能的方向发展,高频PCB(Printed Circuit Board,印制电路板)设计成为了电子产品研发过程中的关键技术之一。良好的高频PCB设计不仅...
在本文中,我们将深入探讨如何使用...总结起来,Java实现的画板程序涉及到GUI设计、图形绘制、事件处理、文件操作等多个核心Java技术。通过学习和实践这个项目,开发者可以加深对Java Swing的理解,提升GUI编程能力。
总结来说,"opencv画板功能实现源程序"项目通过OpenCV提供的图形绘制函数和鼠标事件处理,实现了让用户在交互式窗口上自由绘画的功能。项目中可能涉及多个Python模块,每个模块负责不同的功能,如主程序控制、画板...
总结,画板Demo例子主要展示了如何在HTML5环境中使用画板API进行图形绘制。通过理解并实践这些基本操作,开发者可以创建出丰富多样的网页图形效果和应用程序。在压缩包`jihehuabao5.06`中,可能包含了实现这些示例的...
总结来说,玲珑画板6.045版是一款轻量级但功能强大的数学作图工具,它的出现为数学教育领域提供了新的可能性。无论是教学还是自学者,都可以从中受益,通过直观的图形化方式加深对数学的理解,提升学习效率。所以,...
总结而言,“几何画板文件打包机(GSP转EXE)”是一项具有革命性的发明。它不仅解决了教学资源分享的难题,而且显著提升了教学和学习的效率。这款工具让几何画板的使用更加灵活,方便教师和学生在没有安装几何画板...
总结来说,"WPF+WCF画板聊天程序"是一个结合了先进图形界面技术与高效通信机制的创新应用,它利用WPF创建了生动的画板环境,借助WCF实现实时的聊天和协作功能,为用户提供了一种新颖的在线沟通和创作方式。...
总结起来,"几何画板课件350套 (2).zip" 是一个全面的几何学教育资源,包含了大量的教学实例和练习,适用于教师的教学辅助和学生的学习巩固。无论是在课堂教学还是自主学习中,这个压缩包都能提供丰富的素材,帮助...
总结一下,易语言画板自动换行写模块是一个帮助开发者在画板上实现文本自动换行显示的工具。它涉及到了字符串处理、字符测量、画板操作等多个方面的知识,是易语言图形界面编程中的一项实用技术。通过学习和应用这个...
总结起来,易语言画板带滚动条加载图片的实现涉及到文件操作、控件交互、事件处理等多个知识点。通过熟练掌握这些技能,开发者可以创建出具有高级交互功能的图形用户界面,满足各种复杂的显示需求。在实际应用中,还...
#### 六、总结 通过本文的详细介绍,我们了解到几何画板5.01控件不仅解决了以往版本中存在的问题,还进一步增强了其功能性和易用性。对于广大教师来说,这一工具无疑将成为提升教学质量的重要帮手。无论是制作动态...
总结来说,通过“易语言画板画线”项目的开发,学习者能够深入理解易语言的编程基础,包括图形用户界面的设计、事件驱动编程、绘图命令的使用,以及文件操作等。该项目不仅能够帮助初学者快速上手易语言编程,而且...
总结,这个"VC实现的画板"项目是一个综合性的学习案例,涵盖了Windows编程的基础、GUI设计、事件处理、绘图函数和状态管理等多个方面。对于想要提升VC编程技能,尤其是对GUI应用程序开发感兴趣的开发者来说,这是一...
总结,MFC为创建Windows桌面应用提供了强大的支持,尤其是对于画板类应用,MFC的图形绘制能力和用户交互处理机制使得开发过程更为简便。通过定制CView类,结合MFC的事件处理和GDI绘图API,我们可以构建出功能丰富的...