自定义文件的格式,可以进行保存与打开,正在学习,下面的代码不是很难,主要是要想清楚:
保存;
package 画图板升级0516; /** *画图板的升级 */ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import javax.swing.*; import javax.swing.GroupLayout.Group; public class DrawUI extends JFrame{ // 单选按钮组 ButtonGroup group = new ButtonGroup(); String path = "F:\\file1\\a.image";// 保存文件的路径 JPanel center; public static void main(String[] args) { DrawUI draw = new DrawUI(); draw.creatDraw(); } /** * 初始化窗体 */ public void creatDraw(){ this.setTitle("画图板"); this.setSize(500,300); //退出JFrama this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置窗体的布局为Border BorderLayout layout = new BorderLayout(); this.setLayout(layout); //设置菜单按钮 JMenuBar bar = creatJMenuBar(); this.setJMenuBar(bar); JPanel left =this.creatleft() ; JPanel center = this.creatCenter(); JPanel bottom = this.creatBottom(); //设置边框布局 this.add(left,BorderLayout.WEST); this.add(center,BorderLayout.CENTER); this.add(bottom,BorderLayout.SOUTH); this.setVisible(true); DrawListener lis = new DrawListener(group); center.addMouseListener(lis); } /** * 创建菜单条的方法 * @return */ public JMenuBar creatJMenuBar(){ JMenuBar bar = new JMenuBar(); JMenu menu = new JMenu("文件"); JMenuItem saveitem = new JMenuItem("保存"); saveitem.setActionCommand("save"); JMenuItem openitem = new JMenuItem("打开"); openitem.setActionCommand("open"); menu.add(saveitem); menu.add(openitem); bar.add(menu); //创建监听器的的对象 ActionListener alis = new MyListener(); saveitem.addActionListener(alis); openitem.addActionListener(alis); return bar; } /** * 设置左边 * @return */ public JPanel creatleft(){ //左边 JPanel left = new JPanel(); //设置背景颜色 left.setBackground(new Color(200,200,200,200)); //设置最佳大小 left.setPreferredSize(new Dimension(50,100)); //在左边添加按钮 String[] items = { "直线", "矩形", "椭圆"}; String[] commands = { "line", "rect", "oval" }; for(int i = 0 ;i<items.length;i++){ //设置单选按钮 JRadioButton btn = new JRadioButton(items[i]); //设置按钮的动作命令 btn.setActionCommand(commands[i]); // 分为同一个组 group.add(btn); if (i == 0) {//设置第一个被选中 btn.setSelected(true); } left.add(btn); } return left; } /** * 设置中间 * @return */ public JPanel creatCenter(){ //中间 center = new myJPanel(); center.setBackground(Color.WHITE); return center; } /** * 设置右边 * @return */ public JPanel creatBottom(){ //下边 JPanel bottom = new JPanel(); bottom.setBackground(new Color(200,200,200,200)); //设置大小setPreferredSize指设置最佳大小 bottom.setPreferredSize(new Dimension(50,50)); return bottom; } /** * * @author *重写paint()的方法 */ class myJPanel extends JPanel{ public void paint(Graphics g) { super.paint(g); // 遍历保存形状的队列 for (int i = 0; i < DrawListener.list.size(); i++) { // 取得一个形状对象 Shape sh = DrawListener.list.get(i); // 绘制形状 sh.draw(g); } } } //添加监听器 class MyListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { //得到动作命令 String command = e.getActionCommand(); System.out.println(command); if(command.equals("save")){ try{ // 将内存中的形状队列保存到文件中 File file = new File(path); FileOutputStream fos = new FileOutputStream(file); // 包装成对象流 ObjectOutputStream oos = new ObjectOutputStream(fos); // 写对象之前先要保存形状的个数 oos.writeInt(DrawListener.list.size()); for (int i = 0; i < DrawListener.list.size(); i++) { Shape sh = DrawListener.list.get(i); // 将对象写到文件中 oos.writeObject(sh); } // 强制输出 oos.flush(); fos.close(); }catch(Exception ef){ ef.printStackTrace(); } }if(command.equals("open")){ try{ // 建立文件输入流 File file = new File(path); FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); // 先读取形状的个数 int len = ois.readInt(); for (int i = 0; i < len; i++) { // 读取一个形状对象 Shape sh = (Shape) ois.readObject(); //将读取到的形状对象保存到队列中 DrawListener.list.add(sh); } fis.close(); //刷新绘制面板 center.repaint(); }catch(Exception ef){ ef.printStackTrace(); } } } } }
package 画图板升级0516; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import javax.swing.ButtonGroup; import javax.swing.JPanel; public class DrawListener extends MouseAdapter{ static ArrayList<Shape> list = new ArrayList<Shape>(); int x1,x2,y1,y2; private Graphics g; private ButtonGroup group; private String command; private Color c; public DrawListener(ButtonGroup group){ this.group = group; } public void mousePressed(MouseEvent e) { //获得获得事件源对象 JPanel center =(JPanel) e.getSource(); // 只需要绘制在center上,所以需要从Center上取画布 // 获得center组件在屏幕上占据的区域 g = center.getGraphics(); // 获得要绘制的形状 // 得到按钮组中被选中的按钮的动作命令 command =group.getSelection().getActionCommand(); x1 = e.getX(); y1 = e.getY(); } public void mouseReleased(MouseEvent e) { x2 = e.getX(); y2 = e.getY(); if(command.equals("line")){ Line line = new Line(x1, y1, x2, y2, c); list.add(line); line.draw(g); }else if(command.equals("rect")){ Rect rect =new Rect(x1, y1, x2, y2, c); list.add(rect); rect.draw(g); } } }
package 画图板升级0516; import java.awt.Color; import java.awt.Graphics; import java.io.Serializable; public abstract class Shape implements Serializable { int x1,x2,y1,y2; Color c; void draw(Graphics g){ } }
package 画图板升级0516; import java.awt.Color; import java.awt.Graphics; public class Line extends Shape { public Line(int x1, int y1, int x2, int y2, Color c) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.c = c; } public void draw(Graphics g){ g.setColor(c); g.drawLine(x1, y1, x2, y2); } }
package 画图板升级0516; import java.awt.Color; import java.awt.Graphics; public class Rect extends Shape { public Rect(int x1, int y1, int x2, int y2, Color c) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.c = c; } public void draw(Graphics g){ g.setColor(c); g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2)); } }
相关推荐
本资料将重点探讨如何在S7-200SMART中实现自定义填表与先进先出(FIFO)的操作,以提高系统效率和数据管理能力。 一、自定义填表 自定义填表是PLC编程中的一个重要概念,它允许用户根据特定需求创建并存储数据。在...
**jQuery图片自定义热区**是一种网页开发技术,主要用于增强用户体验,通过在图像上创建可交互的区域,用户可以通过点击或悬停在这些热区上获取额外信息或执行特定操作。这种技术通常用于地图、产品展示或其他需要...
总之,自定义图片裁剪功能在Android应用中具有广泛的应用,通过理解并实践上述步骤,开发者可以创建出符合自己应用需求的裁剪功能。同时,`CropDemo`这样的示例项目是学习和参考的好资源,可以帮助我们更好地理解和...
2. 创建自定义`DatePickerDialog`类:继承`DatePickerDialog`,并重写构造函数,以便在创建实例时传入自定义布局。在构造函数中,通过`LayoutInflater`加载自定义布局,并替换默认的布局。 ```java public class ...
"自定义写出内存"是指将自定义数据类型的数据写入内存,这可能是为了临时存储、处理或传递这些数据。而"字节集文件到自定义"和"写到自定"可能指的是从字节集文件读取数据并转换回自定义数据类型,或者将自定义数据...
- 在`testTreeView`项目中,可能包含了创建和使用自定义模型的示例代码,包括模型类的定义、数据结构的实现以及与`QTreeView`的关联等。 通过以上步骤,我们可以构建出一个符合业务需求的自定义模型,配合`...
在"自定义plugin插件实现phonegap与Android交互"这个主题中,我们主要关注的是如何通过编写自定义插件来打通JavaScript和Android之间的通信壁垒。在PhoneGap中,Plugin是连接Web层和Native层的桥梁,它们是用Java...
本教程将专注于自定义语言的插件开发,特别是如何利用properties文件和customLanguage API来实现这一目标。以下是一些核心知识点: 1. **IntelliJ IDEA 插件开发环境搭建** 在开始开发之前,首先需要安装IntelliJ ...
通过正确地备份、读取和恢复`Request.Body`和`Response.Body`,我们可以在自定义中间件中实现对请求和响应数据的全面监控。这在开发日志记录、安全审计或其他需要拦截请求和响应数据的场景中特别有用。理解这些核心...
这段代码将内置的"图片.bmp"资源读取到内存,然后创建一个新的"output.bmp"文件并将图片数据写出。请注意,实际编程时需要处理可能的错误,如资源不存在、文件无法打开等。 总的来说,火山PC提供了强大的资源管理...
在本文中,我们将探讨如何使用`vue-video-player`这个Vue.js组件来实现自定义全屏切换效果。`vue-video-player`是一个基于`video.js`的视频播放器,它提供了丰富的API和自定义选项,使得在Vue项目中集成视频播放变得...
使用JavaScript和CSS进行事件监听和样式控制,可以实现与原生下拉列表相似的交互效果。 3. **使用第三方库**: 有一些前端框架和库如jQuery、React、Vue等提供了扩展的下拉组件,它们支持在选项中插入HTML内容,...
本例程重点介绍了如何在Qt环境下,通过重载QDataStream的operator和operator>>来实现自定义类型的数据读写,从而简化对文件的操作。 首先,理解QDataStream类是Qt中处理二进制数据流的核心工具,它允许我们以结构化...
在QT编程中,自定义对话框(Dialog)是一种常见的需求,它允许用户与应用程序进行交互,展示特定的信息或接收用户的输入。本项目“QT自定义dialog提示窗”着重于通过纯代码方式创建对话框,无需使用UI文件。下面将...
首先,微信小程序提供了获取用户基本信息的功能,主要通过`wx.login()`和`wx.getUserInfo()`两个API实现。`wx.login()`用于获取用户的临时登录凭证(code),而`wx.getUserInfo()`则用于获取用户的昵称、头像等基本...
Tcl的高级特性包括数组、信息查询命令(如info)、自定义命令执行(如unknown)、动态载入扩展库等,这些特性使得Tcl能够适应各种复杂的编程场景。 通过学习以上内容,读者可以掌握Tcl编程的基础知识,进而可以编写...
在提供的"易语言自定义数据类型的内存存储方式"源码文件中,你可以找到具体的实现细节,例如数据类型的定义、成员的读写函数等。 总的来说,易语言自定义数据类型的内存存储方式是编程中一个基础但关键的概念,理解...
### ZedBoard-自定义IP核实现与PS成功调用详解 #### 一、概述 在本文档中,我们将深入探讨如何在ZedBoard平台上实现自定义IP核,并将其成功地与PS(Processing System)部分进行集成。ZedBoard是一款基于Xilinx Zynq...
C语言作为底层编程的强大工具,与Simulink结合,能够实现高效且灵活的自定义模块。本教程将深入探讨如何利用C语言来创建自定义的Simulink模块。 一、Simulink基础 Simulink是MATLAB的一个扩展,主要用于系统级的...
本文将深入探讨如何利用Canvas API来获取图片的主要色调、近似色、互补色,并且基于这些颜色信息创建主题配色方案。我们将不涉及任何具体插件的使用,而是通过JavaScript原生方法实现这一过程。 首先,我们需要加载...