绘画程序案例:

原视频排错找了半天,原来是变量名的问题

package cn.dzz;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage; public class Sketchpad {
// 窗体对象
private Frame frame = new Frame();
// 画板宽高
private final int WIDTH = 500;
private final int HEIGHT = 400; private PopupMenu popupMenu = new PopupMenu();
private MenuItem redMenuItem = new MenuItem("red");
private MenuItem greenMenuItem = new MenuItem("green");
private MenuItem blueMenuItem = new MenuItem("blue"); // 定义一个变量记录画笔的颜色
private Color localColor = Color.BLACK; // 缓冲图像对象
BufferedImage bufferedImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); // 获取图形对象
Graphics graphics = bufferedImage.getGraphics(); // 自定义一个Canvas画布类
class DrawingBoard extends Canvas {
@Override
public void paint(Graphics g) {
// super.paint(g);
g.drawImage(bufferedImage, 0, 0, null);
}
}
Canvas canvas = new DrawingBoard(); // 缓冲光标的坐标值
private int buffLocationX = -1;
private int buffLocationY = -1; public void init() {
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String actionCommand = e.getActionCommand();
switch (actionCommand) {
case "red" :
localColor = Color.RED;
break;
case "green" :
localColor = Color.GREEN;
break;
case "blue" :
localColor = Color.BLUE;
break;
}
}
}; redMenuItem.addActionListener(actionListener);
greenMenuItem.addActionListener(actionListener);
blueMenuItem.addActionListener(actionListener); popupMenu.add(redMenuItem);
popupMenu.add(greenMenuItem);
popupMenu.add(blueMenuItem); canvas.add(popupMenu);
canvas.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
//super.mouseReleased(e);
boolean popupTrigger = e.isPopupTrigger();
if (popupTrigger) {
popupMenu.show(canvas, e.getX(), e.getY());
} // 刷新坐标
buffLocationX = -1;
buffLocationY = -1;
}
}); // 设置背景白色
graphics.setColor(Color.WHITE);
graphics.fillRect(0,0, WIDTH, HEIGHT); // 通过监听鼠标行为实现绘画功能
canvas.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
//super.mouseDragged(e); if (buffLocationX > 0 && buffLocationY > 0) {
graphics.setColor(localColor);
graphics.drawLine(buffLocationX, buffLocationY, e.getX(), e.getY());
} // 将缓冲的坐标更新到鼠标释放后的位置
buffLocationX = e.getX();
buffLocationY = e.getY(); // 刷新画布
canvas.repaint();
}
}); canvas.setPreferredSize(new Dimension(WIDTH, HEIGHT));
frame.add(canvas);
frame.pack();
frame.setVisible(true);
} public static void main(String[] args) {
new Sketchpad().init();
}
}

演示效果:

ImageIO的使用

static BufferedImage read(File input)
static BufferedImage read(InputStream input)
static boolean write(RenderedImage im, String formatName, File)

案例:

package cn.dzz;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException; public class ImageCheck { private Frame frame = new Frame("图片查看器"); // 菜单组件
MenuBar menuBar = new MenuBar();
Menu fileMenu = new Menu("file");
MenuItem openMenuItem = new MenuItem("open image");
MenuItem saveMenuItem = new MenuItem("save as ..."); // 展示图片的画布组件, 根据IO对象的调用方式猜测是一个封装二进制流的对象
BufferedImage buffImage; class DisplayUnit extends Canvas {
@Override
public void paint(Graphics g) {
// super.paint(g);
g.drawImage(buffImage, 0, 0, null);
}
}
Canvas canvas = new DisplayUnit(); public void init() throws Exception {
// 组装视图
fileMenu.add(openMenuItem);
fileMenu.add(saveMenuItem);
menuBar.add(fileMenu);
frame.setMenuBar(menuBar);
frame.add(canvas); // 菜单的事件处理
openMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 打开文件对话框并且可见
FileDialog fileDialog = new FileDialog(frame, "open img file", FileDialog.LOAD);
fileDialog.setVisible(true); // 获取文件坐标
String directory = fileDialog.getDirectory();
String file = fileDialog.getFile(); // 使用图片IO对象根据文件坐标读取,加载到buffImage对象中
try {
buffImage = ImageIO.read(new File(directory + file));
// 画布对象就可以根据buffImage对象渲染出来画面了
canvas.repaint();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
});
saveMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 打开文件对话框并且可见
FileDialog fileDialog = new FileDialog(frame, "save img file", FileDialog.SAVE);
fileDialog.setVisible(true); // 获取保存文件坐标
String directory = fileDialog.getDirectory();
String file = fileDialog.getFile();
// 获取后缀名的方法 这里存在的问题是如果格式后缀一定要写,如果不写就是无法写入到硬盘中(或者就是硬编码写死在方法的参数中)
String suffix = file.substring(file.lastIndexOf(".") + 1); try {
// 格式名称是取文件的后缀
ImageIO.write(buffImage, suffix, new File(directory + file));
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}); // 位置,大小,可见,可关闭
frame.setBounds(200,200,704,508);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// super.windowClosing(e);
System.exit(0);
}
});
} public static void main(String[] args) {
try {
new ImageCheck().init();
} catch (Exception e) {
e.printStackTrace();
}
}
}

  

【Java-GUI】06 绘图 Part2 位图处理的更多相关文章

  1. java GUI Graphics2D 绘图

    Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力.本节讲解Graphics类,下节讲解Graphics2D. Graphics类提供基本的几何图形绘制方法,主要有:画线段 ...

  2. Java GUI编程4---标签组件JLabel

    Java GUI编程4---标签组件JLabel 2018年06月11日 22:06:58 蓝蓝223 阅读数 12103更多 个人分类: Java书籍摘抄 所属专栏: Java Swing图形界面 ...

  3. java Gui编程 事件监听机制

    1.     GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式:   1. 命令交互方式    图书管理系统 ...

  4. Java GUI 图书管理系统

    01 概述 一款功能强大的图书馆管理系统,功能齐全,小白/大学生项目实训,学习的不二之选. 02 技术 此系统使用 java awt 实现.java.awt是一个软件包,包含用于创建用户界面和绘制图形 ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. JAVA GUI

    JAVA GUI中的事件处理:   委托事件模型:事件源对象和监听器对象具有绑定关系   一个监听器可以绑定多个事件源 一个事件源也可以绑定多个监听器 监听器有各自监听的事件类型   设置容器的布局管 ...

  7. paip.java gui swt/jface 最佳实践

    paip.java gui swt/jface 最佳实践 1. 工具:Eclipse +jigloo4 1 2. 安装插件: 1 1. IMPORT swt lib 2 2. 新建立窗体 2 3. 运 ...

  8. 写在学习Java GUI之前

    Java GUI就是用Java语言开发桌面应用,而Java又有三个Java GUI库,分别为AWT,Swing和SWT/JFace. 现在要学的是Swing库. 后记:开发桌面应用,不止一种技术,现在 ...

  9. JAVA GUI 工具

    Java GUI图形界面开发工具   上大学那会儿比较主流的Java图形开发插件是:Visual Editor 和 SWT Designer, 不久又出了个Jigloo, 但去官网看了下发现这个东西也 ...

  10. [置顶] java Gui 键盘监听事件

    简单写一个java Gui键盘监听事件,实现的效果就是按下键盘控制台输出你按下的键.比如:按下A控制台就输出A 效果如图: 以下把实现的效果分为几个步骤: 1.新建一个窗体类继承窗体: 2.给这个窗体 ...

随机推荐

  1. 箭头函数 函数中的this指向

      // 箭头函数         // 在匿名函数中,使用 => 箭头来替换 关键词 function          // 箭头定义下 () 和 {} 之间         // 等于在使 ...

  2. 2020年你不可不知的自动化框架,可替代Selenuim的测试框架Top10

    Selenium是一种开源自动测试工具.它可以跨不同的浏览器和平台在Web应用程序上执行功能,回归,负载测试.Slenium是最好的工具之一,但确实有一些缺点. 业界有一些强大的工具可以替代Selen ...

  3. 「C++」简单模拟

    这是一个公式: \[F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n}{\sqrt{ ...

  4. Qt 应用程序中自定义鼠标光标

    在 Qt 应用程序中,你可以自定义鼠标光标.你可以使用 `QCursor` 类来设置不同类型的鼠标光标,比如内置样式或者自定义的图片.以下是一些使用示例: 使用内置光标样式 Qt 提供了一些内置的光标 ...

  5. CodeForces 1935A

    题目链接:Entertainment in MAC 思路 当当前操作次数n为偶数时,若原字符串大于反转字符串则可以将原字符串反转n - 2次,则得到的还是原字符串,此时反转一次,并将其再次反转的字符串 ...

  6. 04-Python文件操作

    打开文件 f=open("我的文件.txt","r",encoding="utf8") #打开一个文件(读模式) f.close() #关闭 ...

  7. 基于 Termux 和 ipv6 把手机打造成公网服务器

    Termux 安装与配置 安装 从这下载: https://f-droid.org/en/packages/com.termux/ 初始化 授权读写手机储存 termux-setup-storage ...

  8. Gitlab的安装和使用

    安装和配置必要的依赖项 yum install dnf sudo dnf install -y curl policycoreutils openssh-server #将SSH服务设置成开机自启动 ...

  9. 动环监控方案,为什么推荐79元全志T113-i国产平台?

    什么是动环监控系统? 通信电源及机房环境监控系统(简称"动环监控系统"),是对分布在各机房的电源柜.UPS.空调.蓄电池等多种动力设备,及门磁.红外.窗破.水浸.温湿度.烟感等机房 ...

  10. SpringBoot读取配置文件的几种方式

    示例 user: name: zhaotian age: 18 sex: 男 @Value注解 @Value注解是Spring框架提供的用于注入配置属性值的注解,它可用于类的成员变量.方法参数和构造函 ...