虽然题目是简单画板,可是对于咱这个菜鸟来说就是一把辛酸泪啊,巴特,至于以下是不是荒唐言咱就,嘿嘿不好说了。
开发画板有三个基本点。
1.窗口界面。
画板窗口包括四个主要部分。
工具按钮面板,颜色选择面板,画布,以及菜单栏。
这并不难,无非就是JButton和JPanel和JToolBar。
不过我被一个小小的问题难住了好久,就是设置按钮的大小。
只有JFrame可以用setSize,其他的容器统统只能用setPreferredZize,例如
this.setPreferredSize(new Dimension(100,400));
但是想要给容器里的容器,恩简单来说,比如工具按钮是加在工具面板上的,这时想要设置工具按钮的大小,比如让它和贴图的大小一致,就会遇上问题。这时需要将布局设为流式布局!
JToolBar jtb = new JToolBar("工具");
jtb.setPreferredSize(new Dimension(90,250));
jtb.setLayout( new FlowLayout(FlowLayout.CENTER));
this.add(jtb);
不同容器默认的布局管理器是不一样的。可以使用这几行代码
public class Test {
public static void main(String[]args){
System.out.println(new JToolBar().getLayout());
System.out.println(new JFrame().getLayout());
System.out.println(new JPanel().getLayout());
System.out.println(new JButton().getLayout());
}
}
得到的是
javax.swing.JToolBar$DefaultToolBarLayout@2e7263
java.awt.BorderLayout[hgap=0,vgap=0]
java.awt.FlowLayout[hgap=5,vgap=5,align=center]
null
2.绘制图形
一个画图板至少可以绘制四种以上的图形,显然把这些图形的代码全部写在一起是不现实的,某人一开始就是写在一起,结果,出错的时候自己都不愿意看。
在画图的时候显然我们使用的是一个概念“画”!那么就可以直接定义一个有“画”这个方法的图形的抽象类,让其他的图形实现的类来继承它,
(为什么我们不使用接口要使用抽象类?因为画一个图形你起码得要四个以上的参数x1,x2,y1,y2才行,接口的属性可不能是它们!)
public abstract class Shape {
private int x1,x2,y1,y2;
private float size;
private Color color;
public abstract void draw(Graphics2D g);
}
Graphics里面有各种方法,drawLine,drawRect,drawOval...
关键就在于你怎么将得到的参数传进去,让它正确的画出你想要的图形。
直线不用说,最简单了!可是就是这最简单的直线是实现后面铅笔什么的基础。
这里举个矩形的例子,如果你只是简单的把 x1,x2,y1,y2传进去肯定是不行的。这是它自己的描述:
public void drawRect(int x, int y, int width, int height) {
if ((width < 0) || (height < 0)) {
return;
}
if (height == 0 || width == 0) {
drawLine(x, y, x + width, y + height);
} else {
drawLine(x, y, x + width - 1, y);
drawLine(x + width, y, x + width, y + height - 1);
drawLine(x + width, y + height, x + 1, y + height);
drawLine(x, y + height, x, y + 1);
}
}
要传入的参数分别是最左上方那个点,以及它的长与宽。由于你画矩形的方向不一样,最左上角的点不一定是x1,y1,
此时可以写判断!
if(x2>x1&&y1>y2)
{ g.drawRect(x1,y2,x2-x1,y1-y2);}
else if(x1>x2&&y1>y2)
{g.drawRect(x2, y2, x1-x2, y1-y2);}
else if(x1>x2&&y2>y1){
g.drawRect(x2,y1,x1-x2,y2-y1);
}
else if(x2>x1&&y2>y1){
g.drawRect(x1,y1,x2-x1,y2-y1);
}
这样写就有点纠结了,因为后面的画圆和圆角矩形都是类似矩形的传参。Java对椭圆的定义是填充一个矩形里的椭圆,穿的也是这个矩形的参数。
由于左上角的点永远是坐标最小的点,要想简化的话,所以可以用到Math这个包包里的东西
g.drawRect(Math.min(x1, x2),Math.min(y1, y2),Math.abs(x1-x2),Math.abs(y1-y2));
在有就是铅笔(就是曲线)和橡皮了。看上去这两种工具都是随你的鼠标落点画线。换个角度看,这种曲线可以细分成无数条直线,简而言之就是在你的鼠标落点之间作线,只不过这些线无限短罢了。这样你只要吧得到的坐标传递一下,让你现在的落点,也就是上一条直线的终点变成下一条直线的起点!
那么橡皮功能就只要设置线条粗一点,颜色是白色(和画布颜色一致)就好了!
x2 = e.getX();
y2 = e.getY();
command = tb.getCommand();
Shape shape = new ImpLine(x1, y1, x2, y2, 1, color);
if (command.equals("pencil")) {
shape = new ImpLine(x1, y1, x2, y2, 1, color);
} else if (command.equals("eraser")) {
shape = new ImpLine(x1, y1, x2, y2, 10, Color.white);
}
shape.draw(g);
x1 = x2;
y1 = y2;
注意:这里得到坐标的是在mouseDragged()里面哦!
3.图形重绘
只要设置好监听,并重载构造方法传递参数,注意传参时最好传递不会改变的对象,比如JPanel类型的画布面板,再在传入后得到画布就好了,而不要直接传入画布。
那么基本的小画板就可以画画了,可是又有一个问题,当画布大小改变的时候,上面的东西全部没有啦!
为什么呢?因为你没用让他“记住”你画的图形!
为了让画板记住,要定义个队列的类,这个类里起码要有三种方法!加入(add()),得到(get()),长度(size())。以下是这个队列所继承的接口
public interface ListInterface<E> {
public void add(E e);
public E get(int index);
public int size();
}
在画图形的监听器里面调用这个add()方法,把图形存进去。
此时工作完成了一半,还需要一个重绘的方法。
//重绘的方法
public void drawShape(Graphics2D g){
for(int i=0;i<shapeList.size();i++){
//取出
Shape sh =shapeList.get(i);
//重绘
sh.draw(g);
}
}
把存进去的图形依次取出来,再重新画出来。
sh是Shape(画图形的抽象类)类型,draw()是该类里“画”的方法!
重绘的方法时写完了,谁来调用这个方法呢?每个容器里都自带了一个paint()方法!他是用来显示容器的,可以重写这个方法哦!这样在每一次显示容器的时候(改变大小)就可以重绘了。
public void paint(Graphics g){
//调用父类的方法绘制正确的窗体
super.paint(g);
//取出队列中存储的形状
drawShape((Graphics2D)g);
}
这个画板目前确实很简陋,很多功能都很蹩脚,不过总是会慢慢完善的啦!
有源代码哦!
分享到:
相关推荐
总结来说,【C# 2010 简易画板】是一个教学性质的项目,它展示了如何利用C# 2010和Windows Forms开发一个基本的画图应用。这个项目涵盖了GUI设计、事件处理、GDI+图形绘制以及状态管理等多个关键知识点,对于学习C#...
【C#简易画板代码】是一个使用C#编程语言实现的简单绘图应用程序,它提供了基本的绘画功能,包括新建画布、保存作品、选取颜色以及调整画笔大小。此外,用户还可以绘制多种图形,如直线、曲线、矩形、圆形等。这个...
总结,这个Java简易画板项目不仅锻炼了学生的编程技能,还提高了他们对GUI设计和人机交互的理解。通过这个实践,初学者将能够更好地掌握Java编程,尤其是GUI应用开发,为后续的软件开发奠定坚实的基础。
《iOS中的简易画板开发详解》 在移动设备上,画板应用是一种常见的创意工具,让用户可以自由地绘制、涂鸦。"ios-画板.zip" 提供的是一款简易的画板应用程序,它具备最基础的绘画功能。本文将深入探讨iOS平台上构建...
在这个简易画板应用中,用户可以通过手指在屏幕上画画,选择不同的颜色,并进行简单的绘图操作。 首先,我们要了解的是触摸事件处理。在Android平台上,这是通过`MotionEvent`类来完成的。当用户在屏幕上触摸或滑动...
在本资源"简单的jQuery网页画板涂鸦代码.zip"中,包含了一个基于jQuery实现的简易网页画板功能。这个画板允许用户通过鼠标在页面上进行涂鸦,从而实现在线绘图的效果。以下是对该技术实现的详细解析: 首先,jQuery...
总结,"几何画板辅助数学教学技术开发源程序.rar"为数学教育带来了新的可能性,让抽象的数学概念变得生动而直观,同时提供了丰富的教学素材和创新空间。教师和学生都可以从中受益,体验到数学的魅力和乐趣。
"Android 画板开发之橡皮擦功能" Android 画板开发之橡皮擦功能是 Android 应用程序开发中一个常见的需求。该功能允许用户擦除画板上的内容,实现橡皮擦的功能。在本文中,我们将详细介绍 Android 画板开发之橡皮擦...
在本文中,我们将深入探讨如何使用Java编程语言来实现一个类似于Windows操作系统中的简易画板程序。这个Java小程序将提供基本的绘图功能,使用户能够通过鼠标或触控设备进行绘画创作。 首先,我们需要理解Java GUI...
在Android开发中,创建一个简单的画板功能是一个常见的需求,比如用于绘图应用或教育类应用。本项目名为“简单画板实现”,它基于自定义View和SurfaceView来达成这一目标。下面我们将深入探讨如何利用这些技术来构建...
总结起来,"简易画板Demo"涵盖的知识点包括:iOS图形上下文的使用、贝塞尔路径绘图、触摸事件处理、用户界面设计、数据持久化以及可能的图像处理算法。这个项目对于学习iOS开发,特别是图形界面编程来说,是一个很好...
总结来说,“易源码-画板”项目代表了软件开发领域中一种以用户为中心的开发理念,其目标是提供易于理解和使用的源代码,从而加速用户学习和开发的过程。尽管它可能使用了一种特殊格式的文件,但项目的透明度和可...
总结来说,通过“易语言画板画线”项目的开发,学习者能够深入理解易语言的编程基础,包括图形用户界面的设计、事件驱动编程、绘图命令的使用,以及文件操作等。该项目不仅能够帮助初学者快速上手易语言编程,而且...
总结,这个基于C++和OpenGL的画图板项目是一个很好的实践,它涵盖了OpenGL的基本概念、窗口管理、事件处理以及简单的图形绘制。通过学习和实现这样的项目,开发者可以深入理解OpenGL的工作流程,并为更复杂的3D图形...
- **快速访问**:通过简单的操作步骤,教师可以快速地将几何画板文件集成到演示文稿中,便于课堂讲解。 - **灵活性高**:用户可以根据需要调整几何画板文件在文档中的显示大小,满足不同的教学需求。 - **定制化设置...
该描述中提到的“windows自带的画板工具”可能是指Microsoft Paint(画图),这是一款简单的图形编辑程序,常用于基础的绘图操作。然而,在Web环境中,我们通常需要借助特定的JavaScript库或插件来实现类似的功能。...
这个标题揭示了一个使用Java编程语言开发的图形用户界面应用,它模仿了Windows操作系统中的“画板”工具。在计算机科学中,画板程序通常指的是允许用户通过鼠标或其他输入设备进行图形绘制的应用。这种程序常用于...
在IT行业中,自定义画板是一种常见的交互式应用,它为用户提供了一个自由创作的空间,能够进行绘画、草图设计或简单的绘图操作。"效果超炫的自定义画板"这款应用显然旨在提供一个功能丰富且用户体验良好的画布,让...
总结来说,【简单绘画板 图形学课设】是一个结合理论与实践的优秀课设项目,它不仅适合初学者巩固计算机图形学的基础知识,也能够激发学生对图形学深入研究的兴趣。通过这样的项目实践,学生将能更好地理解图形学...