以下是简单画板实现的步骤和一些自己得心得体会:
一.实现简单画板的步骤:
1.定义一个类,该类继承JFrame类。
2.定义一个现实界面的方法,在方法中设置窗体的属性。
3.实例化按钮,将按钮添加到窗体上。
4.给按钮添加监听器方法,绑定事件处理类对象。
5.得到窗体上的画布对象 Graphics,在使用画布对象来画相应的图形。
6.给窗体鼠标监听器,并且绑定事件处理类对象。
二.实现代码
画板实现类
package java0625;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
/**
* 画板窗体类,该类要继承JFrame类
*
* @author NetJava
*
*/
public class DrawFrame extends JFrame {
/**
* 主函数
*/
public static void main(String[] args) {
DrawFrame df = new DrawFrame();
df.init();
}
/**
* 定义一个现实界面的方法
*/
public void init() {
// 设置窗体的属性
this.setTitle("未命名-画图");
this.setResizable(false);
// 实例化菜单
JMenu menuFile = new JMenu("文件(F)");
JMenuBar menuBar = new JMenuBar();
JMenuItem newItem = new JMenuItem("新建(N)");
JMenuItem newItem02 = new JMenuItem("打开(O)");
JMenuItem newItem03 = new JMenuItem("保存(S)");
JMenuItem newItem04 = new JMenuItem("另存为(A)");
JMenuItem newItem05 = new JMenuItem("发送(E)");
JMenuItem newItem06 = new JMenuItem("退出(X)");
// 创建快捷方式
newItem.setMnemonic('N');
newItem02.setMnemonic('O');
newItem03.setMnemonic('S');
newItem04.setMnemonic('A');
newItem05.setMnemonic('E');
newItem06.setMnemonic('X');
newItem.setAccelerator(KeyStroke.getKeyStroke('N', Event.CTRL_MASK));
newItem02.setAccelerator(KeyStroke.getKeyStroke('O', Event.CTRL_MASK));
newItem03.setAccelerator(KeyStroke.getKeyStroke('S', Event.CTRL_MASK));
newItem04.setAccelerator(KeyStroke.getKeyStroke('A', Event.CTRL_MASK));
newItem05.setAccelerator(KeyStroke.getKeyStroke('E', Event.CTRL_MASK));
newItem06.setAccelerator(KeyStroke.getKeyStroke('X', Event.CTRL_MASK));
menuFile.add(newItem);
menuFile.add(newItem02);
menuFile.add(newItem03);
menuFile.add(newItem04);
menuFile.add(newItem05);
menuFile.add(newItem06);
menuBar.add(menuFile);
this.setJMenuBar(menuBar);
JMenu menuFile02 = new JMenu("编辑(E)");
JMenuItem neWItem1 = new JMenuItem("撤销(U)");
JMenuItem neWItem021 = new JMenuItem("重复(R)");
JMenuItem neWItem031 = new JMenuItem("剪切(T)");
JMenuItem neWItem041 = new JMenuItem("复制(C)");
JMenuItem neWItem051 = new JMenuItem("粘贴(V)");
JMenuItem neWItem061 = new JMenuItem("全选(A)");
// 创建快捷方式
neWItem1.setMnemonic('Z');
neWItem021.setMnemonic('Y');
neWItem031.setMnemonic('X');
neWItem041.setMnemonic('C');
neWItem051.setMnemonic('V');
neWItem061.setMnemonic('A');
neWItem1.setAccelerator(KeyStroke.getKeyStroke('Z', Event.CTRL_MASK));
neWItem021.setAccelerator(KeyStroke.getKeyStroke('Y', Event.CTRL_MASK));
neWItem031.setAccelerator(KeyStroke.getKeyStroke('X', Event.CTRL_MASK));
neWItem041.setAccelerator(KeyStroke.getKeyStroke('C', Event.CTRL_MASK));
neWItem051.setAccelerator(KeyStroke.getKeyStroke('V', Event.CTRL_MASK));
neWItem061.setAccelerator(KeyStroke.getKeyStroke('A', Event.CTRL_MASK));
menuFile02.add(neWItem1);
menuFile02.add(neWItem021);
menuFile02.add(neWItem031);
menuFile02.add(neWItem041);
menuFile02.add(neWItem051);
menuFile02.add(neWItem061);
menuBar.add(menuFile02);
JMenu menuFile03 = new JMenu("查看(V)");
JMenuItem neWItem2 = new JMenuItem("撤销(U)");
JMenuItem neWItem022 = new JMenuItem("重复(R)");
JMenuItem neWItem032 = new JMenuItem("剪切(T)");
JMenuItem neWItem042 = new JMenuItem("复制(C)");
JMenuItem neWItem052 = new JMenuItem("粘贴(V)");
JMenuItem neWItem062 = new JMenuItem("全选(A)");
// 创建快捷方式
neWItem2.setMnemonic('Z');
neWItem022.setMnemonic('Y');
neWItem032.setMnemonic('X');
neWItem042.setMnemonic('C');
neWItem052.setMnemonic('V');
neWItem062.setMnemonic('A');
neWItem2.setAccelerator(KeyStroke.getKeyStroke('Z', Event.CTRL_MASK));
neWItem022.setAccelerator(KeyStroke.getKeyStroke('Y', Event.CTRL_MASK));
neWItem032.setAccelerator(KeyStroke.getKeyStroke('X', Event.CTRL_MASK));
neWItem042.setAccelerator(KeyStroke.getKeyStroke('C', Event.CTRL_MASK));
neWItem052.setAccelerator(KeyStroke.getKeyStroke('V', Event.CTRL_MASK));
neWItem062.setAccelerator(KeyStroke.getKeyStroke('A', Event.CTRL_MASK));
menuFile03.add(neWItem2);
menuFile03.add(neWItem022);
menuFile03.add(neWItem032);
menuFile03.add(neWItem042);
menuFile03.add(neWItem052);
menuFile03.add(neWItem062);
menuBar.add(menuFile03);
JMenu menuFile04 = new JMenu("图像(I)");
JMenuItem neWItem3 = new JMenuItem("撤销(U)");
JMenuItem neWItem023 = new JMenuItem("重复(R)");
JMenuItem neWItem033 = new JMenuItem("剪切(T)");
JMenuItem neWItem043 = new JMenuItem("复制(C)");
JMenuItem neWItem053 = new JMenuItem("粘贴(V)");
JMenuItem neWItem063 = new JMenuItem("全选(A)");
// 创建快捷方式
neWItem3.setMnemonic('Z');
neWItem023.setMnemonic('Y');
neWItem033.setMnemonic('X');
neWItem043.setMnemonic('C');
neWItem053.setMnemonic('V');
neWItem063.setMnemonic('A');
neWItem3.setAccelerator(KeyStroke.getKeyStroke('Z', Event.CTRL_MASK));
neWItem023.setAccelerator(KeyStroke.getKeyStroke('Y', Event.CTRL_MASK));
neWItem033.setAccelerator(KeyStroke.getKeyStroke('X', Event.CTRL_MASK));
neWItem043.setAccelerator(KeyStroke.getKeyStroke('C', Event.CTRL_MASK));
neWItem053.setAccelerator(KeyStroke.getKeyStroke('V', Event.CTRL_MASK));
neWItem063.setAccelerator(KeyStroke.getKeyStroke('A', Event.CTRL_MASK));
menuFile04.add(neWItem3);
menuFile04.add(neWItem023);
menuFile04.add(neWItem033);
menuFile04.add(neWItem043);
menuFile04.add(neWItem053);
menuFile04.add(neWItem063);
menuBar.add(menuFile04);
JMenu menuFile05 = new JMenu("颜色(I)");
JMenuItem neWItem4 = new JMenuItem("撤销(U)");
JMenuItem neWItem024 = new JMenuItem("重复(R)");
JMenuItem neWItem034 = new JMenuItem("剪切(T)");
JMenuItem neWItem044 = new JMenuItem("复制(C)");
JMenuItem neWItem054 = new JMenuItem("粘贴(V)");
JMenuItem neWItem064 = new JMenuItem("全选(A)");
// 创建快捷方式
neWItem4.setMnemonic('Z');
neWItem024.setMnemonic('Y');
neWItem034.setMnemonic('X');
neWItem044.setMnemonic('C');
neWItem054.setMnemonic('V');
neWItem064.setMnemonic('A');
neWItem4.setAccelerator(KeyStroke.getKeyStroke('Z', Event.CTRL_MASK));
neWItem024.setAccelerator(KeyStroke.getKeyStroke('Y', Event.CTRL_MASK));
neWItem034.setAccelerator(KeyStroke.getKeyStroke('X', Event.CTRL_MASK));
neWItem044.setAccelerator(KeyStroke.getKeyStroke('C', Event.CTRL_MASK));
neWItem054.setAccelerator(KeyStroke.getKeyStroke('V', Event.CTRL_MASK));
neWItem064.setAccelerator(KeyStroke.getKeyStroke('A', Event.CTRL_MASK));
menuFile05.add(neWItem4);
menuFile05.add(neWItem024);
menuFile05.add(neWItem034);
menuFile05.add(neWItem044);
menuFile05.add(neWItem054);
menuFile05.add(neWItem064);
menuBar.add(menuFile05);
// 是用JSpanel对容器进行布局
JPanel pan1 = new JPanel(new FlowLayout());
JPanel pan2 = new JPanel();
JPanel pan3 = new JPanel();
pan1.setSize(70, 750);
pan1.setBackground(Color.GRAY);
pan2.setSize(530, 750);
pan3.setSize(new Dimension(600, 50));
pan3.setBackground(Color.blue);
pan2.setBackground(Color.white);
Container contentPane = this.getContentPane();
// 用当前类的路径去获取图片的路径
java.net.URL ur01 = this.getClass().getResource("image01.jpg");
ImageIcon image01 = new ImageIcon(ur01);
JLabel j01 = new JLabel(image01);
java.net.URL ur02 = this.getClass().getResource("image02.jpg");
ImageIcon image02 = new ImageIcon(ur02);
JLabel j02 = new JLabel(image02);
java.net.URL ur03 = this.getClass().getResource("image03.jpg");
ImageIcon image03 = new ImageIcon(ur03);
JLabel j03 = new JLabel(image03);
java.net.URL ur04 = this.getClass().getResource("image04.jpg");
ImageIcon image04 = new ImageIcon(ur04);
JLabel j04 = new JLabel(image04);
java.net.URL ur05 = this.getClass().getResource("image05.jpg");
ImageIcon image05 = new ImageIcon(ur05);
JLabel j05 = new JLabel(image05);
java.net.URL ur06 = this.getClass().getResource("image06.jpg");
ImageIcon image06 = new ImageIcon(ur06);
JLabel j06 = new JLabel(image06);
java.net.URL ur07 = this.getClass().getResource("image07.jpg");
ImageIcon image07 = new ImageIcon(ur07);
JLabel j07 = new JLabel(image07);
java.net.URL ur08 = this.getClass().getResource("image08.jpg");
ImageIcon image08 = new ImageIcon(ur08);
JLabel j08 = new JLabel(image08);
java.net.URL ur09 = this.getClass().getResource("image09.jpg");
ImageIcon image09 = new ImageIcon(ur09);
JLabel j09 = new JLabel(image09);
java.net.URL ur10 = this.getClass().getResource("image10.jpg");
ImageIcon image10 = new ImageIcon(ur10);
JLabel j10 = new JLabel(image10);
java.net.URL ur11 = this.getClass().getResource("image11.jpg");
ImageIcon image11 = new ImageIcon(ur11);
JLabel j11 = new JLabel(image11);
java.net.URL ur12 = this.getClass().getResource("image12.jpg");
ImageIcon image12 = new ImageIcon(ur12);
JLabel j12 = new JLabel(image12);
// 实例化按钮
JButton btnLine = new JButton("Line");
JButton btnRect = new JButton("Rect");
JButton btnOval = new JButton("Oval");
JButton btnColor = new JButton("Color");
// 添加到窗体上
pan1.add(j01);
pan1.add(j02);
pan1.add(j03);
pan1.add(j04);
pan1.add(j05);
pan1.add(j06);
pan1.add(j07);
pan1.add(j08);
pan1.add(j09);
pan1.add(j10);
pan1.add(j11);
pan1.add(j12);
pan1.add(btnLine);
pan1.add(btnRect);
pan1.add(btnOval);
pan1.add(btnColor);
contentPane.add(pan1);
contentPane.add(pan2);
// contentPane.add(pan3);
this.setSize(new Dimension(800, 600));
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
// 使用匿名内部类的方法来实现按钮的动作事件处理类
ActionListener al = new ActionListener() {
// 动作时间的处理方法
public void actionPerformed(ActionEvent e) {
// 判断当前点击的按钮是否是Color
if (e.getActionCommand().equals("Color")) {
// 弹出一个颜色选择器界面,该方法会返回一个选择颜色的值
color = JColorChooser.showDialog(null, "选择颜色", Color.BLACK);
System.out.println("Color:" + color);
} else {
// 如果不是Color,则得到按钮上的文本值
str = e.getActionCommand();
System.out.println("你点击的按钮是:" + str);
}
}
};
// 将动作事件处理类对象绑定到按钮的动作监听器方法上
btnLine.addActionListener(al);
btnRect.addActionListener(al);
btnOval.addActionListener(al);
btnColor.addActionListener(al);
this.setVisible(true);
// 获取窗体上的画布对象,一定要在窗体可见之后才能得到画布对象,否则得到的是空的。
Graphics g = this.getGraphics();
// 实例化一个DrawListener类的对象
DrawListener dl = new DrawListener(g, this);
// 给事件源添加鼠标监听器方法,绑定事件处理类对象。
this.addMouseListener(dl);
}
// 定义颜色属性
private Color color = Color.BLACK;
// 图形属性
private String str = "Line";
// 获取颜色属性
public Color getColor() {
return color;
}
// 获取图形属性
public String getStr() {
return str;
}
}
画板监听器处理类
package java0625;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
/**
* 用来画图形的监听器处理类,该类要实现MouseListener接口
*
* @author NetJava
*
*/
public class DrawListener implements MouseListener {
// 画板窗体类对象
private DrawFrame df = null;
// 画布对象
private Graphics g;
//定义四个保存坐标值的变量
private int x1,y1,x2,y2;
// 带参数的构造方法
public DrawListener(Graphics g, DrawFrame df) {
this.g = g;
this.df = df;
}
// 鼠标按下时事件处理方法
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
}
// 鼠标释放时事件处理方法
public void mouseReleased(MouseEvent e) {
//得到选择的图形
String str = df.getStr();
//设置当前所化图形的颜色
g.setColor(df.getColor());
x2 = e.getX();
y2 = e.getY();
//判断是否是相应的图形,如果是,则画相应的图形
if(str.equals("Line")){
g.drawLine(x1, y1, x2, y2);
}else if(str.equals("Rect")){
g.drawRect(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2));
}else if(str.equals("Oval")){
g.drawOval(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2));
}
}
// 鼠标进入组件时触发事件处理方法
public void mouseEntered(MouseEvent e) {
}
// 鼠标退出组件时触发事件处理方法
public void mouseExited(MouseEvent e) {
}
// 单击事件处理方法
public void mouseClicked(MouseEvent e) {
}
}
体会心得:
完成一个画板程序第一个遇到的问题就是怎么实现一个鼠标监听器,应该怎么选择,这是一个问题,很多时候你要分析一下你添加的监听器的作用是什么,实现的功能是什么,这都是写代码之前要分析的,然后当我完成了鼠标监听器的添加之后,觉得这个画板还是太单一,怎么去完善画板界面,然后一个个去添加,还要选择好的布局器,真的挺麻烦,要把那些工具排版好要花很多功夫,你需要去熟悉每种工具的特点,这就是我在完成简单画板的一些心得。
分享到:
相关推荐
【C# 2010 简易画板】是一个基于C# 2010编程语言开发的简易画图应用程序。这个程序为用户提供了一个简单的画板界面,允许用户进行基本的绘画操作,比如绘制直线、曲线、矩形、椭圆等图形,并能进行颜色选择、画笔...
C++程序开发基于Qt实现的简单绘画板程序源码+项目说明.zip 基于Qt实现的简单绘画板程序。 ## 功能介绍 - 绘制点、直线、椭圆、矩形等基本几何图形; - 存储、读取绘图文件; - 撤回、重做等功能; - 调节线宽、线条...
这个简易画板程序是学习Qt GUI编程的一个良好起点,涵盖了基本的窗口创建、事件处理和图形绘制。随着技能的提升,可以进一步优化程序,如添加撤销/重做功能、多层绘图、自定义形状工具等。Qt提供的强大功能使得...
本压缩包“易语言简易画板源码.rar”提供了一个易语言编写的简单画板程序的源代码,对于初学者来说,这是一个很好的学习资源,可以了解图形用户界面(GUI)的创建、事件驱动编程以及图形绘制的基本原理。 1. GUI...
一个简易画板的实现 有简单的画图,画图形,改颜色功能
在这个简易画板应用中,我们可能创建一个`Form`对象作为主窗口,并在其中添加一个无边框的`PictureBox`控件,用于显示画布。通过设置`PictureBox`的`SizeMode`属性为`StretchImage`,可以让其完全填充窗体空间。 ...
在描述中提到,“简单的C++简易画板源代码,适合新手练习使用”,这暗示了这个项目包含了一个用C++编写的简易画板应用程序的源代码。这个程序可能实现了基本的绘图功能,如画线、填充颜色等,让学习者可以通过修改和...
【MFC简易画板】是基于Microsoft Foundation Class (MFC) 库开发的一款简单图形编辑器,它利用VC++开发工具实现,旨在提供类似于Windows操作系统自带的“画图”程序的功能。这款应用允许用户进行基本的绘图操作,如...
QT做的简易画板是一款基于Qt框架开发的图形用户界面应用,它允许用户通过鼠标操作进行基本的绘图活动。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备上,支持多种操作系统,如Windows、Linux...
易语言简易画板源码,简易画板,公用接口_寻找文件扩展,公用接口_复制目录,公用接口_数组到表格,公用接口_生成编号,公用接口_生成密码,公用接口_时间到文本,公用接口_数据到十六进制文本,公用接口_十六进制文本到数据,...
简单画板(源代码)有有橡皮筋功能,文本输入功能,文件输入保存功能,调色功能,取色功能等等 用MFC实现
本项目"matlab简易画板GUI程序"是一个基本的图形画板应用,用户可以在这个画板上进行简单的绘图操作,如绘制点、线、矩形和椭圆,同时支持选择颜色和线条粗细。遗憾的是,目前该程序尚未实现添加文本框的功能。 ...
在Android开发中,创建一个简易画板应用是一个常见的练习,它可以帮助开发者深入理解自定义View的概念和绘图机制。这个源码项目就是基于这样的目的,使用了Android的自定义View来构建一个基本的画板功能,让用户可以...
这个“mfc简易画板程序”是针对初学者的一个示例项目,旨在帮助他们理解和实践MFC框架的基本用法。 在MFC中,一个应用程序通常包含多个类,这些类对应于Windows的消息处理机制。例如,CWinApp类代表应用程序本身,...
"简易画板.zip" 提供了一个简单易用的画板应用,允许用户绘制直线并选择多种颜色,这正是计算机图形绘制技术的一个基本体现。下面,我们将深入探讨这个领域的核心知识点。 首先,我们要理解什么是计算机图形。...
【标题】"简单画板-4"所涉及的是一个基于编程实现的简易画板应用,主要探讨了如何在计算机程序中创建一个用户可以进行绘画操作的界面。这个项目可能使用了某种编程语言,如JavaScript、Python或Java,来构建一个交互...
【基于C#的简易画板】是一个使用Visual Studio 2010开发的简单图形编辑器,主要功能是让用户能够绘制基本图形、擦除内容以及在导入的图像上进行绘图。这个项目对于初学者来说,是理解C#图形编程和Windows应用程序...
《Qt之简易画板:构建你的桌面绘画应用》 Qt是一个强大的跨平台应用程序开发框架,广泛应用于桌面、移动和嵌入式系统。本教程将基于Qt框架,介绍如何创建一个简单的画板应用,旨在帮助初学者理解Qt界面编程的基础...
在Android开发中,创建一个简易画板(PaintOnTouchEvent)是一项常见的需求,它涉及到自定义View、触摸事件处理以及用户交互的设计。这个项目的核心在于如何有效地处理OnTouchEvent,以实现用户在屏幕上绘制图形的...
Java Swing 是Java GUI(图形用户界面)库的一部分,它...开发者通过这些技术,为用户提供了一个简易但功能齐全的画板工具,满足了基本的绘图需求。通过深入学习和实践这些概念,可以进一步提升Java GUI编程的能力。