以下是简单画板实现的步骤和一些自己得心得体会:
一.实现简单画板的步骤:
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) {
}
}
体会心得:
完成一个画板程序第一个遇到的问题就是怎么实现一个鼠标监听器,应该怎么选择,这是一个问题,很多时候你要分析一下你添加的监听器的作用是什么,实现的功能是什么,这都是写代码之前要分析的,然后当我完成了鼠标监听器的添加之后,觉得这个画板还是太单一,怎么去完善画板界面,然后一个个去添加,还要选择好的布局器,真的挺麻烦,要把那些工具排版好要花很多功夫,你需要去熟悉每种工具的特点,这就是我在完成简单画板的一些心得。
分享到:
相关推荐
VC++课程设计,windows简单画板,可以画直线、矩形、椭圆、改颜色、线条;清除,保存打开功能。
这是我初学qt编写的简易画板程序,程序结构和算法不算优秀,请多多指教
一个简易画板的实现 有简单的画图,画图形,改颜色功能
易语言简易画板源码,简易画板,公用接口_寻找文件扩展,公用接口_复制目录,公用接口_数组到表格,公用接口_生成编号,公用接口_生成密码,公用接口_时间到文本,公用接口_数据到十六进制文本,公用接口_十六进制文本到数据,...
简单画板(源代码)有有橡皮筋功能,文本输入功能,文件输入保存功能,调色功能,取色功能等等 用MFC实现
用VC开发工具编写的MFC简易画板,可以实现类似与windows自带画板的一些功能
使用Android的自定义View写的Android画板程序,主要使用DrawPath()实现,需要的童鞋可以下来看看。
提供源代码 直接可运行 提供了比较全面的画板功能
使用python做的一个简易画板,能够实现画点、画直线、画多边形、画椭圆等功能,其中包含了对Tkinter的操作以及对于GUI的操作,希望对python初学者能够有所帮助
这是用C# GDI实现的简易画板Demo,对应博文http://blog.csdn.net/luols/article/details/7171668,有需要的朋友可以下载样例试用
matlab简易画板GUI程序 可选择点、线、矩形、椭圆进行画图 可以选择颜色、线条粗细 有橡皮擦、清除按钮 只有添加文本框的功能还没有实现~
用qt做的简易画板,能够实现图形,颜色,线宽选择。用鼠标移动操作。
本程序为简易画板程序,主要解决画板的一些基本问题,并保持绘画的流畅。希望对新人有所帮助
c#简单画板程序 有c#代码编写的简单画板程序 代码类资源
易语言源码易语言简易画板源码.rar 易语言源码易语言简易画板源码.rar 易语言源码易语言简易画板源码.rar 易语言源码易语言简易画板源码.rar 易语言源码易语言简易画板源码.rar 易语言源码易语言简易画板源码....
简易画板,源码分享,适用于初学C语言,期末大作业等。
简单的绘图工具 的代码
VB制作的简单画板程序,可以改变画笔颜色
vs2010上基于C#编写的简易画板,可画简易图形,擦出,并且在导入图片上绘画
Python开发的PyGame实现简易画板_Demo