`
李媛媛liyuanyuan
  • 浏览: 15189 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

画板总结

阅读更多
实现仿xp画板
1.定义一个画板主界面类,给类要继承自JFrame。
public class SampleDrawing extends JFrame{
}
2.在类中定义一个主函数和初始化界面的方法。
    public static void main (String [] args ){
       //实例化对象
       SampleDrawing sd = new SampleDrawing();
       //调用初始化界面的方法
       sd.init();
    }
3.初始化界面,设置窗体的属性,添加不同的工作面板。
1.由xp画板可知一个简单的画板基本上需要有一个工具面板,颜色面板,画图形面板。
2.定义一个工具类面板

public class ToolsPanel extends JPanel{

//定义一个属性用来保存用户选择的图形
private String type = "Line";
//定义获取图形属性值的方法
public String getType(){
return type;
}
//定义构造方法
public  ToolsPanel(){
//// 给ToolsPanel设置布局为流式布局,但是JPanel默认的布局就是流布局,所以此处不需要设
this.setLayout(new FlowLayout());
//实例化一个面板用来添加按钮
JPanel jp = new JPanel();
// 设置panel对象的布局为网格布局
panel.setLayout(new GridLayout(8, 2, 2, 2));
//创建一个数组,=来储存图片
String [] array={
//图片的地址名
"image/BrushTool.jpg", "image/EraserTool.jpg",
"image/LineTool.jpg", "image/PencilTool.jpg",
"image/AnyTool.jpg", "image/RectTool.jpg",
"image/RoundRectTool.jpg", "image/BigTool.jpg",
"image/SprayGunTool.jpg", "image/QulineTool.jpg",
"image/FilledTool.jpg", "image/Rect1Tool.jpg",
"image/tubianTool.jpg", "image/WordTool.jpg",
"image/OvalTool.jpg", "image/diguanTool.jpg"
};

/**
* 使用匿名内部类来实现动作监听器事件处理类对象
*/
ActionListener al = new ActionListener(){
//动作事件的处理方法
public void actionPerformed(ActionEvent e) {
//获取用户选择的图形
type = e.getActionCommand();
//输出
System.out.println(type);
}

};
// 使用循环来实例化按钮,并且添加到面板上
for (int i = 0; i < array.length; i++) {
//实例化一个图标对象
ImageIcon image = new ImageIcon(array[i]);
// 实例化按钮对象,让按钮显示图标
JButton btn = new JButton(image);
//设置按钮的大小
btn.setPreferredSize(new Dimension(30,30));
//获取图片的名字
String imageName = array[i].substring(array[i].indexOf("/")+1, array[i].lastIndexOf("Tool.jpg"));
//设置按钮的动作命令
btn.setActionCommand(imageName);
//给按钮加上动作监听器方法,绑定事件处理类对象
btn.addActionListener(al);
// 将按钮添加到panel面板上
jp.add(btn);
}
//设置ToolsPanel的背景颜色
this.setBackground(Color.DARK_GRAY);
// 将jp面板对象添加到ToolsPanel上
this.add(jp);
}
}
3.定义一个颜色面板类
public class ColorPanel extends JPanel{

//定义颜色属性
private Color color=Color.BLACK;
                      //定义获取颜色属性值的方法
public Color getColor(){
return color;
}

/**
* 定义构造方法
*/
public ColorPanel (){

//给ColorPanel设置布局为流式布局,但是JPanel默认的布局就是流布局(注意:流布局默认是剧中的),
//所以此处需要设置布局
this.setLayout(new FlowLayout(FlowLayout.LEFT));
//实例化一个面板,放置颜色按钮
JPanel jp =new JPanel(); //设置面板布局格式
jp.setLayout(new GridLayout(2,14,2,2));
// 定义一个颜色数组
Color[] array = { 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.WHITE, Color.YELLOW,
new Color(100, 140, 100), new Color(17  0, 100, 200),
new Color(100, 150, 100), new Color(100, 200, 100),
new Color(100, 140, 100), new Color(105, 170, 150),
new Color(170, 100, 160), new Color(130, 170, 160),
new Color(150, 100, 100), new Color(200, 190, 130),
new Color(100, 120, 100), new Color(200, 104, 100),
new Color(100, 160, 180), new Color(200, 130, 140),
new Color(160, 100, 180) };
//使用匿名内部类
ActionListener al = new ActionListener(){
//动作事件的处理方法
public void actionPerformed(ActionEvent e) {
//得到事件源对象
JButton btn = (JButton)e.getSource();
//获取用户选择的颜色
color = btn.getBackground();
//输出
System.out.println(color);
}
};
// 使用循环来实例化按钮,并且添加到面板上
for (int i = 0; i < array.length; i++) {
// 实例化按钮对象
JButton btn = new JButton();
//设置按钮的背景颜色
btn.setBackground(array[i]);
//设置按钮的大小
btn.setPreferredSize(new Dimension(15,15));
//给按钮添加动作监听器方法,绑定事件处理类对象al
btn.addActionListener(al);

jp.add(btn);
}
//设置ColorPanel的背景颜色
this.setBackground(Color.DARK_GRAY);
// 将jp添加到ColorPanel上
this.add(jp);
}


}
4.创建一个画图面板
public class DrawingPanel extends JPanel {

/**
* 定义构造方法
*/
public DrawingPanel(){
//设置背景颜色为白色
this.setBackground(Color.WHITE);
}

}
5.将上面三者添加到DrawingBorder 窗体上去,
6.给给画图的面板类添加鼠标监听器方法,绑定事件处理类对象。定义鼠标事件处理类,
实现MouseListener接口和MouseMotionLOistener借口,实现接口中的方法,在方法里边去画图形。
public class DrawingListener implements MouseListener,MouseMotionListener{
//用来获取图像
private ToolsJpanel tp;
//用来获取颜色
private ColorJpanel cp;
//用来画图
private Graphics g;
//用来存储两次点击的坐标值
private int x1,y1,x2,y2,x,y,temx,temy,count=0;
public DrawingListener(ToolsJpanel tp,ColorJpanel cp, Graphics g){
this.tp=tp;
this.cp=cp;
this.g=g;
}
/**
* 鼠标在事件源上按下时调用的方法
*/
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.getColor());
//判断用户选择的图形是否是直线
if(tp.getType().equals("Line")){
g.drawLine(x1, y1, x2, y2);
}else if(tp.getType().equals("Rect")){
if (x1 < x2 && y1 < y2) {
g.drawRect(x1, y1, Math.abs(x2 - x1), Math.abs(y2 - y1));
} else if (x1 > x2 && y1 > y2) {
g.drawRect(x2, y2, Math.abs(x1 - x2), Math.abs(y1 - y2));
} else if (x1 > x2 && y1 < y2) {
g.drawRect(x2, y1, Math.abs(x1 - x2), Math.abs(y1 - y2));
} else if (x1 < x2 && y1 > y2) {
g.drawRect(x1, y2, Math.abs(x1 - x2), Math.abs(y1 - y2));
}
}else if(tp.getType().equals("Oval")){
//......
}else if(tp.getType().equals("tubian")){//实现多边形
if(count==0){
g.drawLine(x1, y1, x2, y2);
x=x1;
y=y1;
temx=x2;
temy=y2;
count++;
}else{
g.drawLine( temx,temy, x2, y2);
if(temx==x2&&temy==y2){
g.drawLine( x, y, x2, y2);
}
temx=x2;
temy=y2;
}
}
}

/**
* 鼠标在事件源上按下并拖动时执行的方法
*/
public void mouseDragged(MouseEvent e) {
//设置图形的颜色
g.setColor(cp.getColor());
if(tp.getType().equals("Brush")){//判断用户选择的图形是否是刷子,如果是则开始画粗线条的线
//鼠标在事件源按下拖动时获取第二个点的坐标值
x2 = e.getX();
y2 = e.getY();
//设置线条的粗细
//首先将Graphics类型的g对象强制转换为Graphics2D的对象
Graphics2D g2d = (Graphics2D)g;
//调用Graphics2D设置线条粗细的方法来设置线条的粗细
g2d.setStroke(new BasicStroke(8));
//开始绘制粗线条
g2d.drawLine(x1, y1, x2, y2);
//将线结束点的坐标作为下一条线的开始点
x1 = x2;
y1 = y2;
//重新设置线条的粗线
g2d.setStroke(new BasicStroke(1));
}else if(tp.getType().equals("SprayGun")){//如果是喷枪
//获取坐标值
x2=e.getX();
y2=e.getY();
//实例化一个随机数对象
Random rand = new Random();
//循环画多个点
for(int i=0;i<20;i++){
//随机生成新的x和y点,用来绘制不同的点
int x = rand.nextInt(8);
int y = rand.nextInt(8);
//开始绘制点
g.drawLine(x2+x, y2+y, x2+x, y2+y);
}
}
//其他
}

/**
* 鼠标进入事件源时调用的方法
*/
public void mouseEntered(MouseEvent e) {

}

/**
* 鼠标退出事件源时调用的方法
*/
public void mouseExited(MouseEvent e) {

}

/**
* 鼠标在事件源同一个点上按下和释放时调用的方法
*/
public void mouseClicked(MouseEvent e) {

}
/**
* 鼠标在事件源上移动时执行的方法
*/
public void mouseMoved(MouseEvent e) {

}


}
分享到:
评论

相关推荐

    java画图板的总结

    这篇博客的文章链接虽然无法直接查看,但从标题我们可以推测它可能是关于Java Canvas的使用经验和技巧的总结。 首先,Java中的Canvas类是一个非常基础的绘图接口,它没有内置的绘图功能,需要开发者自行实现。你...

    protel99SE画板简明流程总结

    Protel99SE是一款经典且广泛使用的电子设计自动化(EDA)软件,主要用于电路原理图设计和PCB(印制电路板)布局布线。本文将深入解析protel99SE画板的简明流程...希望这份简明总结能为你的PCB设计之路提供有力的支持。

    简单画板开发总结

    在给定的"简单画板开发总结"中,虽然具体使用的编程语言和库未明确指出,但我们可以假设它涉及到的是基本的绘图API的使用。 1. **绘图API**:无论是哪种语言,绘图API都是画板的核心。例如,HTML5的Canvas API提供...

    画板保存总结

    【标题】:“画板保存总结”涉及的知识点主要围绕图形绘制、事件监听和文件操作,这些是计算机图形学和Java编程中的基础概念。 【描述】虽然没有提供具体的内容,但根据“画板保存总结”这一标题,我们可以推测这篇...

    几何画板加自定义工具包.zip

    总结来说,"几何画板加自定义工具包.zip"不仅提供了一个基础的几何画板试用环境,更赠送了一份海量的自定义工具集,使得数学教学和学习变得更加生动有趣。无论是初学者还是经验丰富的用户,都能从中找到适合自己的...

    高频PCB板画板心得总结.docx

    ### 高频PCB板设计心得总结 #### 一、前言 随着电子产品向着更高频率、更高性能的方向发展,高频PCB(Printed Circuit Board,印制电路板)设计成为了电子产品研发过程中的关键技术之一。良好的高频PCB设计不仅...

    Java实现画板(Java小程序 模仿Win系统画板)

    在本文中,我们将深入探讨如何使用...总结起来,Java实现的画板程序涉及到GUI设计、图形绘制、事件处理、文件操作等多个核心Java技术。通过学习和实践这个项目,开发者可以加深对Java Swing的理解,提升GUI编程能力。

    opencv画板功能实现源程序

    总结来说,"opencv画板功能实现源程序"项目通过OpenCV提供的图形绘制函数和鼠标事件处理,实现了让用户在交互式窗口上自由绘画的功能。项目中可能涉及多个Python模块,每个模块负责不同的功能,如主程序控制、画板...

    画板的 Demo 例子

    总结,画板Demo例子主要展示了如何在HTML5环境中使用画板API进行图形绘制。通过理解并实践这些基本操作,开发者可以创建出丰富多样的网页图形效果和应用程序。在压缩包`jihehuabao5.06`中,可能包含了实现这些示例的...

    MFC做的画板MFC做的画板

    总结,MFC为创建Windows桌面应用提供了强大的支持,尤其是对于画板类应用,MFC的图形绘制能力和用户交互处理机制使得开发过程更为简便。通过定制CView类,结合MFC的事件处理和GDI绘图API,我们可以构建出功能丰富的...

    玲珑画板 6.045 版安装.rar

    总结来说,玲珑画板6.045版是一款轻量级但功能强大的数学作图工具,它的出现为数学教育领域提供了新的可能性。无论是教学还是自学者,都可以从中受益,通过直观的图形化方式加深对数学的理解,提升学习效率。所以,...

    WPF+WCF画板聊天程序

    总结来说,"WPF+WCF画板聊天程序"是一个结合了先进图形界面技术与高效通信机制的创新应用,它利用WPF创建了生动的画板环境,借助WCF实现实时的聊天和协作功能,为用户提供了一种新颖的在线沟通和创作方式。...

    易语言画板自动换行写模块

    总结一下,易语言画板自动换行写模块是一个帮助开发者在画板上实现文本自动换行显示的工具。它涉及到了字符串处理、字符测量、画板操作等多个方面的知识,是易语言图形界面编程中的一项实用技术。通过学习和应用这个...

    易语言画板带滚动条加载图片

    总结起来,易语言画板带滚动条加载图片的实现涉及到文件操作、控件交互、事件处理等多个知识点。通过熟练掌握这些技能,开发者可以创建出具有高级交互功能的图形用户界面,满足各种复杂的显示需求。在实际应用中,还...

    vc实现的画板

    总结,这个"VC实现的画板"项目是一个综合性的学习案例,涵盖了Windows编程的基础、GUI设计、事件处理、绘图函数和状态管理等多个方面。对于想要提升VC编程技能,尤其是对GUI应用程序开发感兴趣的开发者来说,这是一...

    web点击按钮事件弹出画板功能的画板插件

    总结来说,实现“web点击按钮事件弹出画板功能”需要利用JavaScript库如Fabric.js,并结合HTML5的canvas元素,监听按钮点击事件,动态加载画板。在视频教学项目中,这个功能能极大地提升教学质量和互动性。同时,...

    画板BMP格式保存和打开总结

    标题中的“画板BMP格式保存和打开总结”是指在编程中处理图像文件时,针对BMP(Bitmap)格式的图像进行保存和读取的操作。BMP是一种无损的位图格式,通常用于Windows操作系统中,它直接存储像素数据,没有经过任何...

    效果超炫的自定义画板

    总结来说,"效果超炫的自定义画板"是一款结合了HTML5 Canvas技术、图像处理、用户交互设计的应用,它提供了丰富的绘图工具,让用户可以在数字平台上自由创作,并能轻松保存和分享自己的作品。其背后的技术实现包括但...

Global site tag (gtag.js) - Google Analytics