画板效果

   (以前写在Csdn上的博文,没去水印,Csdn名字同博客园)

  布局类:

package gary;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File; import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFileChooser;
import javax.swing.JFrame; public class PaintFrame extends JFrame{
//定义按钮
JButton line,rect,round,chooseColor,save,exit; //定义一个绘图区
PaintPanel panel ; //默认颜色是
Color selectColor = Color.GRAY; //构造方法对面板进行初始化
public PaintFrame() {
//1.初始化所有按钮
line = new JButton("线");
rect = new JButton("矩形");
round = new JButton("圆形");
chooseColor = new JButton("选择颜色");
save = new JButton("保存");
exit = new JButton("退出");
//初始化绘图区
panel = new PaintPanel();
panel.setBackground(Color.WHITE); //设置绘图区为白色
chooseColor.setBackground(selectColor);
panel.selectColor = selectColor; //2.初始化窗口
setTitle("画板");
setSize(600,600);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE); //3.把按钮放置在窗口中
add(line);
add(rect);
add(round);
add(chooseColor);
add(save);
add(exit);
//step2:把绘图区放置到窗口中
add(panel); //4.重定位按钮
line.setBounds(1,10,60,30);
rect.setBounds(1,40,60,30);
round.setBounds(1,70,60,30);
chooseColor.setBounds(1,100,60,30);
save.setBounds(1,130,60,30);
exit.setBounds(1,160,60,30);
//重定位绘图区
panel.setBounds(65,10,520,550); //5.给各个按钮注册监听器
//直线
line.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
//改变绘图区的type变量的值为"line"
panel.type = "line";
} }); //矩形
rect.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
//改变绘图区的type变量的值为"rect"
panel.type = "rect";
} }); //圆
round.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
//改变绘图区的type变量的值为"round"
panel.type = "round";
} }); //选择颜色
chooseColor.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
Color color = JColorChooser.showDialog(null, "请选择颜色", selectColor);
selectColor = color; //默认颜色设置成选择的颜色
//讲选择的颜色返回到按钮"选择颜色"的背景上
chooseColor.setBackground(selectColor);
panel.selectColor = selectColor;
} }); //保存
save.addActionListener(new ActionListener(){ @Override
public void actionPerformed(ActionEvent arg0) {
JFileChooser chooser = new JFileChooser();
int cnt = chooser.showDialog(null,"保存");
if(cnt == 0 ) {
//用户选中的文件
File file = chooser.getSelectedFile();
System.out.println("file = " + file.getAbsolutePath());
panel.save(file);
}
} }); //退出
exit.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
} }); //end.设置布局为空,使窗口可见
setLayout(null);
setVisible(true);
} public static void main(String[] args) {
new PaintFrame();
}
}

PaintFrame.class

  功能类:

package gary;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File; import javax.swing.JPanel; public class PaintPanel extends JPanel{ //表示下一次要画的图形类型 "line","rect","round"
String type = "line"; //表示鼠标的横纵坐标
int x,y; //要绘制的颜色
Color selectColor; public PaintPanel() {
//给绘图区添加鼠标点击和释放的监听器
addMouseListener(new MouseListener() { @Override
public void mousePressed(MouseEvent e) {
// 按下
//获得图形的原点
x = e.getX();
y = e.getY();
} @Override
public void mouseReleased(MouseEvent e) {
// 释放
//获得图形的终点
int x1 = e.getX();
int y1 = e.getY();
//获得绘图区的作图器
Graphics2D g = (Graphics2D)getGraphics();
//给作图器设置绘图的颜色
g.setColor(selectColor); //根据type的值绘制不同类型的图形
if(type.equals("line")) {
//绘制直线
g.drawLine(x,y, x1, y1);
}
if(type.equals("rect")) {
//绘制矩形
g.drawRect(x,y,x1-x,y1-y);
}
if(type.equals("round")) {
//绘制椭圆形
g.drawOval(x, y, x1-x, y1-y);
} } @Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub } @Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub } @Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub } }); } public void save(File file) {
//获得相对于文件的缓冲图片
BufferedImage image= new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
//从缓冲图片中获得作图器
Graphics g = image.getGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, getWidth()+1, getHeight()+1);
//向缓存图片上写绘制所有的图形
}
}

PaintPanel.class

画板制作分两个部分:

  (一)界面布局

  (二)实现功能

小知识:

setBounds(x,y,width,height);

x:组件在容器X轴上的起点

y:组件在容器Y轴上的起点

width:组件的长度

height:组件的

 

下面是一个按钮的简单布局

实现过程:

一、界面布局

1.定义所有按钮,把按钮全部放置到面板中

package gary;

import javax.swing.JButton;
import javax.swing.JFrame; public class PaintFrame extends JFrame{
JButton line,rect,round,chooseColor,save,exit; //构造方法对面板进行初始化
public PaintFrame() {
//1.初始化所有按钮
line = new JButton("线");
rect = new JButton("矩形");
round = new JButton("圆形");
chooseColor = new JButton("选择颜色");
save = new JButton("保存");
exit = new JButton("退出"); //2.初始化窗口
setTitle("画板");
setSize(600,600);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE); //3.把按钮放置在窗口中
add(line);
add(rect);
add(round);
add(chooseColor);
add(save);
add(exit); //4.重定位按钮
line.setBounds(1,10,60,30);
rect.setBounds(1,40,60,30);
round.setBounds(1,70,60,30);
chooseColor.setBounds(1,100,60,30);
save.setBounds(1,130,60,30);
exit.setBounds(1,160,60,30); //end.设置布局为空,使窗口可见
setLayout(null);
setVisible(true);
} public static void main(String[] args) {
new PaintFrame();
}
}

chooseColor.setBackground(selectColor);

  

  这样这些按钮就放到面板上了

 

2.把绘图区放置到面板中

 

  绘图区我们用JPanel类来制作,JPanel是一个轻量级面板,不可以单独存在,必要要放到Frame面板上,Frame是一个重量级面板,可以单独存在

  定义一个PaintPanel类用来继承JPanel

  接着到PaintFrame这个类中初始化放置绘图区到面板上:

初始化

    //step2:初始化绘图区
panel = new PaintPanel();
panel.setBackground(Color.WHITE); //设置绘图区为白色

把绘图区放置到窗口中

//step2:把绘图区放置到窗口中
add(panel);

定义绘图区

    //重定位绘图区
panel.setBounds(65,10,520,550);

  板右边就绘制了一个绘图区,为后面绘制直线、圆、矩形设置了一个面板

3.定义颜色

    在PaintFrame类中定义一个颜色

//默认颜色是
Color selectColor = Color.GRAY;

   将"选择颜色"按钮定义为灰色

chooseColor.setBackground(selectColor);

package gary;

import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame; public class PaintFrame extends JFrame{
//定义按钮
JButton line,rect,round,chooseColor,save,exit; //定义一个绘图区
PaintPanel panel; //默认颜色是
Color selectColor = Color.GRAY; //构造方法对面板进行初始化
public PaintFrame() {
//1.初始化所有按钮
line = new JButton("线");
rect = new JButton("矩形");
round = new JButton("圆形");
chooseColor = new JButton("选择颜色");
save = new JButton("保存");
exit = new JButton("退出");
//初始化绘图区
panel = new PaintPanel();
panel.setBackground(Color.WHITE); //设置绘图区为白色
chooseColor.setBackground(selectColor); //2.初始化窗口
setTitle("画板");
setSize(600,600);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE); //3.把按钮放置在窗口中
add(line);
add(rect);
add(round);
add(chooseColor);
add(save);
add(exit);
//step2:把绘图区放置到窗口中
add(panel); //4.重定位按钮
line.setBounds(1,10,60,30);
rect.setBounds(1,40,60,30);
round.setBounds(1,70,60,30);
chooseColor.setBounds(1,100,60,30);
save.setBounds(1,130,60,30);
exit.setBounds(1,160,60,30);
//重定位绘图区
panel.setBounds(65,10,520,550); //end.设置布局为空,使窗口可见
setLayout(null);
setVisible(true);
} public static void main(String[] args) {
new PaintFrame();
}
}

PaintFrame.class

  (左边就是面板的功能区,右边就是画板绘图区,接下来我们就要实现这些按钮的基本功能了)

 

二、实现功能

1.退出(最简单的一个)

 

        exit.addActionListener(new ActionListener() {

            @Override
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
} });

2.选择颜色

  showDialog(Component component, String title, Color initialColor)创建一个颜色对话框参数component指定对话框所依赖的组件,title指定对话框的标题;initialColor指定对话框返回默认颜色

        chooseColor.addActionListener(new ActionListener() {

            @Override
public void actionPerformed(ActionEvent e) {
Color color = JColorChooser.showDialog(null, "请选择颜色", selectColor);
selectColor = color; //默认颜色设置成选择的颜色
//讲选择的颜色返回到按钮"选择颜色"的背景上
chooseColor.setBackground(selectColor);
} });

3.线、矩形、圆形

  在PaintPanel类中定义一个String类型的变量type,用表示下一次要画的图形类型

  在PaintFrame中添加这三个按钮的监听器,每按下一个按钮,改变type的值

 //直线
line.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
//改变绘图区的type变量的值为"line"
panel.type = "line";
} }); //矩形
rect.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
//改变绘图区的type变量的值为"rect"
panel.type = "rect";
} }); //圆
round.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
//改变绘图区的type变量的值为"round"
panel.type = "round";
} });

  

  接下来到PaintPanel类JPanel轻量级面板上实现三个按钮的功能

  关键就是给绘图区添加鼠标点击和释放的监听器

  在PaintPanel类中定义一个x,y来表示鼠标的横纵坐标

//表示鼠标的横纵坐标
int x,y;

  在绘图区给鼠标添加点击和释放的监听器

  点击鼠标时候获得绘制图形起点x,y坐标

  释放鼠标时候获得绘制图形终点x,y坐标

  用type的不同值来调用Graphics2D类中不同方法绘画出不同的图形

addMouseListener(new MouseListener() {

            @Override
public void mousePressed(MouseEvent e) {
// 按下
//获得图形的原点
x = e.getX();
y = e.getY();
} @Override
public void mouseReleased(MouseEvent e) {
// 释放
//获得图形的终点
int x1 = e.getX();
int y1 = e.getY();
//获得绘图区的作图器
Graphics2D g = (Graphics2D)getGraphics();
//根据type的值绘制不同类型的图形
if(type.equals("line")) {
//绘制直线
g.drawLine(x,y, x1, y1);
}
if(type.equals("rect")) {
//绘制矩形
g.drawRect(x,y,x1-x,y1-y);
}
if(type.equals("round")) {
//绘制椭圆形
g.drawOval(x, y, x1-x, y1-y);
} }

  

  接下来把颜色添加到绘画图形线条上面

  在PaintPanel类中定义一个Color类的变量

//要绘制的颜色
Color selectColor;

  

  在释放鼠标绘图器开始绘图的时候添加上颜色

    Graphics2D g = (Graphics2D)getGraphics();
//给作图器设置绘图的颜色
g.setColor(selectColor);

  PaintFrame类设置监听器"设置颜色"按钮上给PaintPanel获得选择的颜色

//选择颜色
chooseColor.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
Color color = JColorChooser.showDialog(null, "请选择颜色", selectColor);
selectColor = color; //默认颜色设置成选择的颜色
//讲选择的颜色返回到按钮"选择颜色"的背景上
chooseColor.setBackground(selectColor);
panel.selectColor = selectColor;
} });

4.保存

  在PaintFrame类中添加"保存"按钮的监听器

        //保存
save.addActionListener(new ActionListener(){ @Override
public void actionPerformed(ActionEvent arg0) {
JFileChooser chooser = new JFileChooser();
int cnt = chooser.showDialog(null,"保存");
if(cnt == 0 ) {
//用户选中的文件
File file = chooser.getSelectedFile();
System.out.println("file = " + file.getAbsolutePath());
panel.save(file);
}
} });

  在PaintPanel类中实现保存功能,调用PaintPanel类中save()保存方法

public void save(File file) {
//获得相对于文件的缓冲图片
BufferedImage image= new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
//从缓冲图片中获得作图器
Graphics g = image.getGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, getWidth()+1, getHeight()+1);
//向缓存图片上写绘制所有的图形
}

  

到这里一个简单的画板就制作出来啦O(∩_∩)O,程序比较简单还有很多可以完善的地方

Java GUI小程序--画板的更多相关文章

  1. java的小程序在html中的运行测试

    java的小程序在html中的运行测试,打开vs2012,以网站模式打开,生成,调用iis临时服务器运行.

  2. 福利贴——爬取美女图片的Java爬虫小程序代码

    自己做的一个Java爬虫小程序 废话不多说.先上图. 目录命名是用标签缩写,假设大家看得不顺眼能够等完成下载后手动改一下,比方像有强迫症的我一样... 这是挂了一个晚上下载的总大小,只是还有非常多由于 ...

  3. Java 获取小程序openid(基于SpringBoot)

    Java 获取小程序openid(基于SpringBoot) 官方文档 wx.login 1.引入Request封装依赖 <!--Request依赖--> <dependency&g ...

  4. Java 编写小程序,下载指定网页上的所有图片

    使用Java编写一个小程序,可以根据指定的网页地址,下载网页中的所有图片:使用到网络编程.线程池.IO和UUID的技术.具体代码如下: import java.io.File; import java ...

  5. java独立小程序实现AES加密和解密

    一.需求: web项目中配置文件配置的密码是明文的, 现在需要修改成密文, 加密方式采用AES, 于是写了个工具类用于加密和解密. 又因为这个密码是由客户来最终确定, 所以为了部署时方便起见, 写了个 ...

  6. java微信小程序调用支付接口(转)

    简介:微信小程序支付这里的坑还是有的,所以提醒各位在编写的一定要注意!!! 1.首先呢,你需要准备openid,appid,还有申请微信支付后要设置一个32位的密钥,需要先生成一个sign,得到pre ...

  7. java微信小程序解密AES/CBC/PKCS7Padding

    摘要:微信小程序解密建议使用1.6及以上的环境使用maven下载jar包org.bouncycastlebcprov-jdk15on1.55加密类代码importorg.bouncycastle.jc ...

  8. Java网页小程序——Java Applet

    Java Applet是编译过的Java程序,可以在所有支持Java的浏览器中运行. 1.Applet的使用 import java.applet.Applet; import java.awt.Gr ...

  9. Java截图小程序源码

    Java编写的全屏截图小程序 package cnom.test.testUtils; import java.awt.AWTException; import java.awt.Dimension; ...

随机推荐

  1. 封装的PKPM BimView的方法

    封装的方法 var ObvApiWrapper; if (!ObvApiWrapper) { ObvApiWrapper = {}; } ObvApiWrapper = function(build, ...

  2. [TensorFlow]Windows下安装并运行Hello World

    参考网址:https://www.tensorflow.org/install/pip (或要VPN) 建议电脑是独显N卡机,安装前先升级驱动,减少不必要错误 1.下载Microsoft Visual ...

  3. 在Xcode4 中将iPhone使用的xib转换成iPad使用的xib

    来源:http://blog.3snews.net/space.php?uid=6188&do=blog&id=64200 http://www.giser.net/?p=982 1 ...

  4. Linux的网络不通流程

    a:xshell连不上的问题第一步:检查网络适配器,是否禁用vmware的虚拟机网卡第二步:检查vmware net8的地址是否为10.0.0.1第三步:检查系统的vmware服务是否启动第四步:检查 ...

  5. Linux下MySQL的数据文件存放在哪里的??

    http://bbs.csdn.net/topics/390620630 mysql> show variables like '%dir%';+------------------------ ...

  6. Android自动化测试探索(一)adb详细介绍

    adb详细介绍 #1. 基本简介 adb,即Android Debug Bridge,它是Android开发/测试人员不可替代的强大工具 #2. Mac上安装adb 安装brew /usr/bin/r ...

  7. Centos 7.6 双网卡绑定实现高可用

    Centos 7.6 双网卡绑定实现高可用 作者:尹正杰 版权声明:原创作品, 谢绝转载!否则将追究法律责任. 一.Bond模式概述 当linux系统上有多个单独网卡,又想充分利用这些网卡,同时对外提 ...

  8. WebService接口学习【1】

    工具: 1.Eclipse(or)IDEA编辑器 2.SoapUI测试工具 1.wsdl文件标签体的约束: 一:namespace:相当于文件的id 二:targetNamespace属性:用来指定s ...

  9. 洛谷 P1020导弹拦截题解

    洛谷链接:https://www.luogu.org/problem/P1020 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...

  10. python 程序练习题

    1.实现isOdd(),参数为整数,如果整数为奇数,返回True,否则返回Flase 代码如下: def isOdd(a): if a%2==0: return False else: return ...