一、简单的画图板设计结构

二、简单画图板的实现结果

三、实现过程中的主要问题
1、UI
(1)BorderLayout的使用
JFrame jf = new JFrame();
jf.setLayout(new BorderLayout());
jf.add(top,BorderLayout.NORTH);
(2)必须在设置可见之后才可以得到画布对象
jf.setVisible(true);
g = panel.getGraphics();
(3)菜单栏的添加
jf.setMenuBar(db); (正确)
jf.add(db); (错误)
(4)鼠标监听器的添加
panel.addMouseListener(dl);
panel.addMouseMotionListener(dl);
2、ShapePanel
(1)在构造方法中调用内部方法以实现
//构造方法
public ShapePanel(){
shapepanel();
}
(2)另外实例化一个专门放置形状选择图片的面板,GridLayout的使用
//实例化一个JPanel对象,作为形状选择的面板
JPanel panelshape=new JPanel();
//设置形状选择面板的布局为网格布局
panelshape.setLayout(new GridLayout(3,7,3,3));
(3)通过定义图片数组,并使用for循环结构,将图片加到形状按钮上
//定义一个数组,包含所有形状选择的图片
String array={"shapeimages/001.jpg","shapeimages/002.jpg","shapeimages/003.jpg","shapeimages/004.jpg",
"shapeimages/005.jpg","shapeimages/006.jpg","shapeimages/007.jpg","shapeimages/008.jpg",
"shapeimages/009.jpg","shapeimages/010.jpg","shapeimages/011.jpg","shapeimages/012.jpg",
"shapeimages/013.jpg","shapeimages/014.jpg","shapeimages/015.jpg","shapeimages/016.jpg",
"shapeimages/017.jpg","shapeimages/018.jpg","shapeimages/019.jpg","shapeimages/020.jpg","shapeimages/021.jpg"};
//使用循环结构方便将图片添加到按钮上
for(int i=0;i<array.length;i++){
//实例化ImageIcon对象,地址为数组
ImageIcon image=new ImageIcon(array[i]);
//实例化按钮对象,并添加图片
JButton btn=new JButton(image);
}
(4)得到图片的名字(substring的使用),并设置按钮的命令为图片的名字
String filename=array[i].substring(array[i].indexOf("/")+1, array[i].lastIndexOf(".jpg"));
btn.setActionCommand(filename);
(5)设置优先大小
//设置按钮的优先选取的大小(Dimension:尺寸)
btn.setPreferredSize(new Dimension(20,20));
(6)在按钮上添加得到其命令的鼠标监听器
btn.addActionListener(al);
//定义一个监听器
private ActionListener al=new ActionListener (){
public void actionPerformed(ActionEvent e){
//获取事件源对象
Object obj=e.getSource();
//强制转型为按钮对象
JButton btn=(JButton)obj;
//把按钮的动作命令赋值给type
DrawingListener.type=btn.getActionCommand();
}
};
3、ToolPanel
(1)定义了粗细的选择之后,设置弹出菜单的实现JpopupMenu的使用,show方法的调用,设置所有者
//弹出菜单的实现
final javax.swing.JPopupMenu menu = new javax.swing.JPopupMenu();
String[] array1 = { "images/4.jpg", "images/5.jpg", "images/6.jpg", "images/7.jpg" };
for (int i = 0; i < array1.length; i++) {
ImageIcon icon = new ImageIcon(array1[i]);
javax.swing.JMenuItem item = new javax.swing.JMenuItem(icon);
menu.add(item);
//substring 返回一个新字符串,它是此字符串的一个子字符串。
String s = array1[i].substring(array1[i].indexOf("/") + 1,array1[i].lastIndexOf(".jpg"));
item.setActionCommand(s);
item.addActionListener(al1);
}
//设置弹出菜单的所有者
menu.setInvoker(btn2);
//给按钮添加监听器
btn2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//设置点击按钮时,出现弹出菜单,并且设置弹出菜单的位置
menu.show(btn2, btn2.getLocation().x-100 ,
btn2.getLocation().y + btn2.getHeight()-10);
}
});
(2)返回粗细值方法的使用
private float stroke=1;
public float getstroke(){
return stroke;
}
private ActionListener al1 = new ActionListener() {
public void actionPerformed(ActionEvent e) {
JMenuItem item = (JMenuItem) e.getSource();
DrawingListener.type = item.getActionCommand();
if(DrawingListener.type.equals("4")){
stroke=1;
}
else if(DrawingListener.type.equals("5")){
stroke=4;
}
else if(DrawingListener.type.equals("6")){
stroke=7;
}
else if(DrawingListener.type.equals("7")){
stroke=10;
}
}
};
4、ColorPanel
(1)鼠标进入出现红色边框的实现,LineBorder的使用
MouseListener mlis = new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
JLabel label = (JLabel) e.getSource();
color = label.getBackground();
DrawingListener.command = "颜色面板";
}
public void mouseEntered(MouseEvent e) {
JLabel label = (JLabel) e.getSource();
label.setBorder(new LineBorder(Color.RED));
}
public void mouseExited(MouseEvent e) {
JLabel label = (JLabel) e.getSource();
label.setBorder(new LineBorder( Color.GRAY));
}
};
(2)绘制边界内像素点
//如果为 true,则该组件绘制其边界内的所有像素。
btn.setOpaque(true);
(3)得到颜色的方法
public Color color;
//定义选取得到颜色的方法
public Color getColor(){
return color;
}
5、ColorChooserPanel
(1)弹出颜色选择器
//设置按钮的监听器
btn.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
showcolorchooser();
//btn.setActionCommand("选择颜色");
DrawingListener.command="选择颜色";
}
});
//弹出颜色选择器
private void showcolorchooser(){
color=JColorChooser.showDialog(null, "颜色选择器", Color.black);
}
(2)得到颜色的方法
private Color color;
//得到颜色
public Color getcolor(){
return color;
}
6、DrawingPanel
(1)重绘
//实例化一个JPanel对象,作为画布绘制的对象,并设置重绘
public JPanel panel=new JPanel(){
//重写方法,进行重绘
public void paint(Graphics g){
super.paint(g);
for(int i=0;i<UI.count;i++){
//将储存的图形一一重新绘制
UI.shapearray[i].shape(g);
}
}
}
(2)得到画画面板的方法
public JPanel getJPanel(){
return panel;
}
7、DrawingListener
(1)改变面板大小,并设置鼠标光标,Cursor的使用
public void mouseEntered(MouseEvent e) {
if ((x1 >= panel.getSize().width-50 && x1 <= panel.getSize().width)
||( y1 >= panel.getSize().height-50
&& y1 <= panel.getSize().height )) {
//调整窗口右下角大小的光标类型。
dp.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR));
}
else{
//调整窗口光标类型还原。
dp.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
public void mouseDragged(MouseEvent e) {
if (x1 >= panel.getSize().width-50
&& x1 <= panel.getSize().width
&& y1 >= panel.getSize().height-50
&& y1 <= panel.getSize().height) {
panel.setSize(new Dimension(x2, y2));
panel.repaint();
g = panel.getGraphics();
}
}
(2)设置粗细
Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(new BasicStroke(tp.getstroke()));
(3)多边形的完成
public void mouseReleased(MouseEvent e) {
//多边形
if(type.equals("006")){
if (state) {
x2 = e.getX();
y2 = e.getY();
a = x1;
b = y1;
c = x2;
d = y2;
shape = new ShapePolygon(x1, y1, x2, y2, color);
shape.shape(g);
state = false;
} else {
x1 = c;
y1 = d;
x2 = e.getX();
y2 = e.getY();
c = x2;
d = y2;
shape = new ShapePolygon(x1, y1, x2, y2, color);
shape.shape(g);
}
}
}
public void mouseClicked(MouseEvent e) {
Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(new BasicStroke(tp.getstroke()));
if (type.equals("006")) {
NetJavaShape shape = new ShapePolygon(c, d, a, b, color);
shape.shape(g);
state = true;
}
}
(4)实现拖拽图形
Color color_temp = Color.white;
if(type.equals("001")){
Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(new BasicStroke(tp.getstroke()));
shape=new ShapeLine(x1,y1,x2,y2,color);
NetJavaShape shape_temp=new ShapeLine(x1,y1,x3,y3,color_temp);
shape_temp.shape(g);//清除上一次的图形
shape.shape(g);//画新的图形
//调用重绘方法
x3 = x2;
y3 = y2;
}
(5)判断颜色来自颜色面板,还是颜色编辑器
//颜色的选择
String command=DrawingListener.command;
if(command.equals("选择颜色")){
color = ccp.getcolor();
}
else if(command.equals("颜色面板")){
color = cp.getColor();
}
(6)重绘中储存图形
//储存图形,计数器加1,已进行重绘
if(UI.count<UI.shapearray.length){
System.out.println("shape = "+shape);
UI.shapearray[UI.count] = shape;
UI.count++;
}
8、ToolEraser(粗了一点的白色铅笔)
9、ToolText(JOptionPane的使用)
public void shape(Graphics g) {
g.setColor(color);
String str=JOptionPane.showInputDialog("请输入文字:");
g.drawString(str, x1, y1);
}
10、DrawingBar
(1)二维数组的使用已实现菜单,菜单栏,菜单项
//调用的内部方法
private void drawingbar() {
//实例化菜单数组
String [] arraymenu={"文件(F)","编辑(E)","图像(I)","颜色(C)","查看(V)","帮助(H)"};
//实例化菜单项数组
String[][] arraymenuitem = {
{ "新建(N)", "打开(O)", "保存(S)", "另存为(A)", "打印预览(V)", "页面设置(U)",
"打印(P)", "发送(E)", "设置为墙纸(平铺(B))", "设置为墙纸(居中)(K)",
"退出(X)" },
{ "撤销(U)", "重复(R)", "剪切(T)", "复制(C)", "粘贴(P)", "清除选定内容(L)",
"全选(A)", "复制到(O)", "粘贴来源(F)" },
{ "工具箱(T)", "颜料盒(C)", "状态栏(S)", "文字工具栏(E)", "缩放(Z)", "查看位图(V)" },
{ "翻转/旋转(F)", "拉伸/扭曲(S)", "反色(I)", "属性(A)", "清除图像(C)",
"不透明处理(D)" },
{ "编辑颜色(E)" },
{ "帮助主题(H)", "关于画图(A)" }
};
//利用循环实现菜单栏(注意嵌套循环结构的使用)
for(int i=0;i<arraymenu.length;i++){
Menu menu=new Menu(arraymenu[i]);
for(int j=0;j<arraymenuitem[i].length;j++){
MenuItem menuitem=new MenuItem(arraymenuitem[i][j]);
menu.add(menuitem);
}
this.add(menu);
}
}

- 大小: 62.3 KB

- 大小: 22.2 KB
分享到:
相关推荐
在Java学习过程中,创建一个简单的画图板是一个经典的练习项目,它可以帮助我们深入理解图形用户界面(GUI)的构建和事件处理机制。本篇小结将聚焦于如何使用Java实现一个基本的画图板,同时提供相关的源码分析。 1...
总结来说,这个C#的简单画图板源码涉及了C#的基础语法、Windows Forms开发、图形绘制、事件处理、颜色选择等核心概念。对于初学者来说,这是一个很好的实践项目,能帮助他们深入理解和掌握这些关键知识点。通过分析...
总结,Windows画图板以其简单易用和功能丰富的特点,成为了日常生活中进行动态画图的得力助手。无论是儿童学习绘画,还是成年人进行快速草图设计,它都能提供一个便捷的平台。通过对画图板的深入理解和熟练运用,...
综上所述,画图板虽然看似简单,但其背后涉及到的技术和设计思路却相当丰富,包括事件处理、用户交互、图形渲染、数据结构、文件操作和网络通信等多个方面。无论是学习编程基础还是深入研究前端技术,理解并实现一个...
总结,"简单画图板代码"项目展示了如何利用C++的纯虚函数和继承特性来构建一个可扩展的图形绘制系统。纯虚函数提供了接口规范,而继承则实现了代码的复用和不同形状的分类。这种设计模式在软件开发中非常常见,尤其...
总结,这个基于C++和OpenGL的画图板项目是一个很好的实践,它涵盖了OpenGL的基本概念、窗口管理、事件处理以及简单的图形绘制。通过学习和实现这样的项目,开发者可以深入理解OpenGL的工作流程,并为更复杂的3D图形...
画图板是一个简单的绘图程序,允许用户在窗口中用鼠标或触摸屏进行绘画。虽然功能简单,但画图板涉及许多GUI编程的核心概念,例如事件处理、绘图技术、组件操作等。通过开发画图板项目,用户能够学习和巩固Qt框架中...
总结来说,“学生制作的画图板”不仅仅是一个简单的绘图软件,它更是一个知识共享和技术合作的平台。它通过提供一个简单易用的画图环境,帮助学生更好地完成作业,激发他们的创造力。同时,它也鼓励学生们在技术领域...
在信息技术领域,创建一个简单的画图板是许多初学者和开发者经常接触的任务。这个过程涉及到图形用户界面(GUI)的设计和编程,通常使用Java这样的面向对象语言。在这个主题中,我们将深入探讨如何实现一个基本的...
本项目“virtual c++6.0 mfc简易画图板”正是基于VC++ 6.0的MFC库,实现了类似Windows自带画图板的功能,让用户能够进行简单的图形绘制,如直线、圆、矩形和椭圆,并且可以调整线条的颜色和类型。 一、MFC库介绍 ...
总结来说,这个"画图板代码"项目涵盖了事件处理、图形绘制、图形状态管理和用户交互设计等多个核心编程概念,是学习和实践GUI编程的一个良好起点。通过深入研究和实践,开发者可以进一步提升在图形用户界面开发领域...
总结起来,一个强大的画图板不仅是一个简单的绘图工具,更是创意表达、协同工作和知识传递的重要平台。它在技术博客中扮演着不可或缺的角色,帮助作者以更直观的方式传达复杂的技术概念。无论你是设计师、教师、学生...
在本文中,我们将深入探讨如何使用C#编程语言创建一个基本的画图板应用程序。C#是一种面向对象的、类型安全的...通过不断迭代和添加更多功能,如保存和加载图片,这个简单的画图板可以成为一个功能丰富的艺术创作工具。
总结来说,这个【Java画图板系统】项目展示了如何使用Java GUI技术来创建一个交互式的绘图应用。通过Eclipse IDE,开发者可以方便地管理、编译和调试代码,确保在不同JDK版本下的一致性。对于学习和理解Java GUI编程...
本项目,即“画图板课程设计”,是基于C++语言和MFC框架实现的一个简单画图工具。它为初学者提供了宝贵的实践机会,通过这个项目,可以深入理解MFC的工作机制,同时掌握图形用户界面(GUI)的创建和交互。 首先,...
《教学用画图板》行业文档...总结,教学用画图板是教育现代化的重要组成部分,它以创新的方式增强了教学互动,提升了教学质量。随着技术的发展,未来教学用画图板的功能将更加完善,有望在更多教育场景中发挥重要作用。
本篇文章将详细探讨如何使用EVC4.0来开发一个简单的画图板程序,该程序具备打开和保存BMP图像文件的能力。 首先,让我们了解EVC4.0。EVC4.0是针对Microsoft Windows CE和Pocket PC等嵌入式平台的C++编译器和开发...
"画图板小程序"就是一个典型的示例,它使用Microsoft Foundation Classes (MFC)库来实现一个简单的绘图应用程序。MFC是微软提供的一套C++类库,用于简化Windows应用程序的开发,它封装了Windows API,提供了面向对象...
### IT知识点:编程入门之画图板开发指南 在IT领域,尤其是软件开发与编程教育中,画图板项目的开发不仅是新手程序员学习图形用户界面(GUI)设计与交互性编程的一个重要实践,也是深入理解Windows消息处理机制、MFC...
【标题】:“强大的vb画图板源码下载” 在编程领域,Visual Basic(VB)是一种常用的编程语言,尤其适合初学者和快速开发简单应用程序。这个“强大的vb画图板源码”显然提供了一个用于图形绘制的用户界面组件,使得...