`
阅读更多

以下是使用java swing写的一个小工具:

 

 

我现在不细说功能,而是说明如何保存使用痕迹,比如上图,我在"old path"输入了"com\common\jn\img\path.png",我想下次打开时"old path"自动保存上一次的记录.

如何实现呢?

(1)可以把文本框的内容保存到properties配置文件中;

(2)关闭窗口或者按下Ctrl+S 时触发保存事件

(3)下次启动窗口时,从配置文件中读取使用痕迹,并恢复到界面上.

具体实现如下

配置文件为

public static final String configFilePath="C:\\.path_config.properties";

 

(a)获取界面上文本框的内容,并设置到properties中,然后写入磁盘

/***
     * 保存到配置文件中
	 * @throws IOException 
     */
    protected void saveConfig() throws IOException{
        File configFile=new File(configFilePath);
        if(!configFile.exists()){
            try {
                SystemHWUtil.createEmptyFile(configFile);
            } catch (IOException e) {
                e.printStackTrace();
                GUIUtil23.errorDialog(e);
            }
        }
        CMDUtil.show(configFilePath);//因为隐藏文件是只读的
//        FileUtils.writeToFile(configFilePath, content);
        if(ValueWidget.isNullOrEmpty(props)){
        	props= new Properties();
        }
        String old_path=oldPathTF.getText();
        if(!ValueWidget.isNullOrEmpty(old_path)){
        	props.setProperty(PROP_KEY_OLD_PATH, old_path);
        }
        
        String folder1=this.compareFolderPanel.getFolderOneTextField().getText();
        if(!ValueWidget.isNullOrEmpty(folder1)){
        	props.setProperty(PROP_KEY_COMPARED_FOLDERONE, folder1);
        }
        String folder2=this.compareFolderPanel.getFolder2TextField().getText();
        if(!ValueWidget.isNullOrEmpty(folder2)){
        	props.setProperty(PROP_KEY_COMPARED_FOLDER2, folder2);
        }
        String sourceFile=this.checkSamePanel.getSourceFileTF().getText();
        if(!ValueWidget.isNullOrEmpty(sourceFile)){
        	props.setProperty(PROP_KEY_SOURCE_FILE, sourceFile);
        }
        String targetFile=this.checkSamePanel.getTargetFileTF().getText();
        if(!ValueWidget.isNullOrEmpty(targetFile)){
        	props.setProperty(PROP_KEY_TARGET_FILE, targetFile);
        }
        /***
         * 增量包中,复制class时是否弹出确认提示框
         */
        boolean isSure=createFolderByPackage.getSureCheckbox().isSelected();
        props.setProperty(PROP_KEY_COPY_JAVA_SURE, String.valueOf(isSure));
        
        boolean isCopyPath=copyCheckbox.isSelected();
        props.setProperty(PROP_KEY_IS_COPY_PATH, String.valueOf(isCopyPath));
      
      
        setCombox(PROP_KEY_ROOT_PATHS, this.createFolderByPackage.getRootFolderTextField(),this.createFolderByPackage.getRootPathComboBox());
        setCombox(PROP_KEY_JAVA_FILE_PATHS, this.createFolderByPackage.getClassTextField(),this.createFolderByPackage.getJavaPathComboBox());
        
        OutputStream out=new FileOutputStream(configFile);
        props.store(out, TimeHWUtil.formatDateTimeZH(null));
        out.close();//及时关闭资源
        CMDUtil.hide(configFilePath);//隐藏文件:attrib ".mqtt_client.properties" +H
        System.out.println("save complete.");
    }
   /***
     * 以;;分隔
     * @param prop_key
     * @param tf
     */
    private void setCombox(String prop_key,JTextField tf,JComboBox<String>comboBox){
        String rootPath=tf.getText();
        if(ValueWidget.isNullOrEmpty(rootPath)){
        	return;
        }
        String roots=props.getProperty(prop_key);
        if(ValueWidget.isNullOrEmpty(roots)){
        	roots=rootPath;
        }else{
        	String roots_old[]=roots.split(SHAREDPICDIVISION);
        	if(!SystemHWUtil.isContains(roots_old, rootPath)){
        		roots=roots+SHAREDPICDIVISION+rootPath;
        		comboBox.addItem(rootPath);
        	}
        	String urls_old2[]=roots.split(SHAREDPICDIVISION);
        	String urls_new[]=SystemHWUtil.unique(urls_old2);
        	roots=StringUtils.join(urls_new, SHAREDPICDIVISION);
        }
        props.setProperty(prop_key, roots);
    }

 注意:CMDUtil.show 是去掉配置文件的隐藏属性,因为隐藏文件不可写.

(b)窗口关闭时触发保存事件

this.addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {
				System.out.println("closing....");
				try {
					saveConfig();
				} catch (IOException e1) {
					e1.printStackTrace();
					GUIUtil23.errorDialog(e1);
				}
				super.windowClosing(e);
			}

			@Override
			public void windowClosed(WindowEvent e) {
				/*System.out.println("closed");
				try {
					saveConfig();
				} catch (IOException e1) {
					e1.printStackTrace();
				}*/
				super.windowClosed(e);
			}
		});

 注意:窗口关闭时只会执行windowClosing(),而不会执行windowClosed()

 

 

(c)增加全局快捷键

/***
		 * 增加全局快捷键.<Br>
		 * Ctrl+S,导致"比例"文本框聚焦
		 */
		protected void setGlobalShortCuts() {
			// Add global shortcuts
			Toolkit toolkit = Toolkit.getDefaultToolkit();
			// 注册应用程序全局键盘事件, 所有的键盘事件都会被此事件监听器处理.
			toolkit.addAWTEventListener(new java.awt.event.AWTEventListener() {
				public void eventDispatched(AWTEvent event) {
					if (event.getClass() == KeyEvent.class) {
						KeyEvent kE = ((KeyEvent) event);
						// 处理按键事件 Ctrl+S
						if (kE.getKeyCode() == KeyEvent.VK_S
								&& kE.isControlDown()&&!kE.isAltDown()
								&& kE.getID() == KeyEvent.KEY_PRESSED) {
							try {
								saveConfig();
							} catch (IOException e) {
								e.printStackTrace();
								GUIUtil23.errorDialog(e);
							}
						} 
					}
				}
			}, java.awt.AWTEvent.KEY_EVENT_MASK);

		}

 注意:为什么要加上条件 kE.getID() == KeyEvent.KEY_PRESSED,根本原因是为了防止触发两次

 

(d)启动程序时,先读取配置文件

/***
	 * 读取配置文件
	 * @throws IOException
	 */
	private void readConfig() throws IOException{
		File configFile=new File(configFilePath);
		if(configFile.exists()){
			InputStream inStream=new FileInputStream(configFile);
			props.load(inStream);
			inStream.close();//及时关闭资源
		}
		String old_path=getPropValue(PROP_KEY_OLD_PATH);
		//"比较文件夹"
		String compared_folderOne=getPropValue(PROP_KEY_COMPARED_FOLDERONE);
		//"比较文件夹"
		String compared_folder2=getPropValue(PROP_KEY_COMPARED_FOLDER2);
		//增量包
		String root_path=getPropValue(PROP_KEY_ROOT_PATHS);
		//增量包
		String java_path=getPropValue(PROP_KEY_JAVA_FILE_PATHS);
		//比较二进制文件
		String sourceFile=getPropValue(PROP_KEY_SOURCE_FILE);
		//比较二进制文件
		String targetFile=getPropValue(PROP_KEY_TARGET_FILE);
		String isSureStr=getPropValue(PROP_KEY_COPY_JAVA_SURE);
		String isCopyPath=getPropValue(PROP_KEY_IS_COPY_PATH);
		if(!ValueWidget.isNullOrEmpty(old_path)){
			oldPathTF.setText(old_path);
		}
		if(!ValueWidget.isNullOrEmpty(root_path)){
			String roots[]=root_path.split(SHAREDPICDIVISION);
			ComponentUtil.fillComboBox(createFolderByPackage.getRootPathComboBox(), roots);
		}
		if(!ValueWidget.isNullOrEmpty(java_path)){
			String java_paths[]=java_path.split(SHAREDPICDIVISION);
			ComponentUtil.fillComboBox(createFolderByPackage.getJavaPathComboBox(), java_paths);
		}
		if(!ValueWidget.isNullOrEmpty(compared_folderOne)){
			compareFolderPanel.getFolderOneTextField().setText(compared_folderOne);;
		}
		if(!ValueWidget.isNullOrEmpty(compared_folder2)){
			compareFolderPanel.getFolder2TextField().setText(compared_folder2);;
		}
		if(!ValueWidget.isNullOrEmpty(sourceFile)){
			checkSamePanel.getSourceFileTF().setText(sourceFile);
		}
		if(!ValueWidget.isNullOrEmpty(targetFile)){
			checkSamePanel.getTargetFileTF().setText(targetFile);
		}
		if(!ValueWidget.isNullOrEmpty(isSureStr)){
			boolean  isSure2=Boolean.parseBoolean(isSureStr);
			createFolderByPackage.getSureCheckbox().setSelected(isSure2);
		}
		if(!ValueWidget.isNullOrEmpty(isCopyPath)){
			boolean  isCopyPath2=Boolean.parseBoolean(isCopyPath);
			copyCheckbox.setSelected(isCopyPath2);
		}
	}

 

上述代码中的一些变量声明:

public static final String configFilePath="C:\\.path_config.properties";
	private Properties props=new Properties();
	/***
	 * path tools
	 */
	public static final String PROP_KEY_OLD_PATH="old_path";
	/***
	 * 比较文件夹
	 */
	public static final String PROP_KEY_COMPARED_FOLDERONE="compared_folderOne";
	/***
	 * 比较文件夹
	 */
	public static final String PROP_KEY_COMPARED_FOLDER2="compared_folder2";
	/***
	 * 增量包
	 */
	public static final String PROP_KEY_ROOT_PATHS="root_paths";
	/**
	 * 增量包的"class文件"
	 */
	public static final String PROP_KEY_JAVA_FILE_PATHS="java_paths";
	/***
	 * 比较二进制文件
	 */
	public static final String PROP_KEY_SOURCE_FILE="sourceFile";
	/***
	 * 比较二进制文件
	 */
	public static final String PROP_KEY_TARGET_FILE="targetFile";
	/***
	 * 增量包中复制class时是否弹出确认提示框
	 */
	public static final String PROP_KEY_COPY_JAVA_SURE="isSure";
	/***
	 * 是否复制路径
	 */
	public static final String PROP_KEY_IS_COPY_PATH="isCopyPath";
	public static final String SHAREDPICDIVISION=";;";

 注意:

(1)window中隐藏文件是只读的,不可写

 

 

(2)对于下拉框,多个路径之间使用两个分号进行分割

配置文件范例:

 

 

项目采用maven构建,源码见附件

 

  • 大小: 66.1 KB
  • 大小: 30.6 KB
  • 大小: 46.1 KB
  • 大小: 7.5 KB
  • 大小: 124.9 KB
0
5
分享到:
评论

相关推荐

    Java Swing 学习代码

    例如,Ctrl+S可以绑定到“保存”操作。 10. **禁用启用菜单(setEnabled)**:根据程序状态,可以启用或禁用菜单项,防止用户在不适当的时间进行操作。 11. **复杂布局(Layout Manager)**:Swing支持多种布局...

    计算机应用基础6(20211010163226).pdf

    - 文件中还提到了Ctrl+S用于保存文档,Ctrl+A用于全选文档内容。 - FTP(File Transfer Protocol)是指文件传输协议,用于在网络上进行文件传输。文档中提到了多个FTP地址,如***/office,表明了在进行办公软件...

    Jave记事本

    例如,设置`Ctrl+O`为打开文件,`Ctrl+S`为保存文件。这需要对`InputMap`和`ActionMap`进行配置,将特定的键组合绑定到相应的动作上。 总的来说,Java记事本项目涵盖了Java GUI编程的多个重要概念,包括Swing组件的...

    使用Intelij设计小型记事本

    使用File &gt; Save或快捷键Ctrl+S来保存项目。 **3. 创建module记事本** 在IntelliJ IDEA中,创建一个新的模块(Module)是开始新项目的好方式。选择File &gt; New &gt; Module,然后选择Swing Application模板。这将自动...

    2021-2022计算机二级等级考试试题及答案No.17333.docx

    2. Word的快捷键:Ctrl+S键在Word中等同于点击工具栏上的保存按钮,用于快速保存文档。 3. 退出Word的快捷键:按下ALT+F4可以在Word中关闭当前文档或退出程序。 4. 局域网的拓扑结构:以太网形式构成的局域网通常...

    2021-2022计算机二级等级考试试题及答案No.19277.docx

    Ctrl+S:标准保存快捷键。 - D. Ctrl+F:查找功能。 - **正确答案**: C.Ctrl+S #### 27. Windows资源管理器的操作 - **知识点**: Windows操作系统操作。 - **后续内容缺失**: - 预期知识点: Windows资源管理器...

    2021-2022计算机二级等级考试试题及答案No.17717.docx

    12. 在记事本或写字板中保存文档,常用快捷键是Ctrl+S。 13. `indexOf()`方法找不到指定子字符串时,会返回-1。 14. 多个筛选条件的选择通常对应于高级筛选/排序操作,所以正确答案是C。 15. JavaScript是一种...

    java学习笔记

    - **文件保存**: 文件名应与`public class`后的类名一致,例如`HelloJava.java`。 - **编译命令**: - 将文件复制到C盘根目录。 - 打开命令提示符(`cmd`),输入`cd\`。 - 编译命令: `javac HelloJava.java`。 - ...

    2021-2022计算机二级等级考试试题及答案No.17373.docx

    5. Visual FoxPro系统配置文件:系统配置文件config.fpw(B)保存了数据库的格式和工作环境设置。 6. 结构化程序设计原则:结构化程序设计强调模块化、自顶向下和逐步求精,但不包含多态性,多态性是面向对象编程的...

    2021-2022计算机二级等级考试试题及答案No.9453.docx

    1. **MySQL默认端口**:MySQL服务器通常使用TCP/IP协议的3306端口进行通信,这是安装时的默认配置(题目中的选项A)。 2. **数据的定义**:数据是储存在某种媒体上的物理符号,它可以是数字、文字、图像等各种形式...

    2021-2022计算机二级等级考试试题及答案No.12040.docx

    - **选择分析**:题目中的正确答案为`Ctrl+S`,这是保存当前编辑文档的常用快捷键。 #### 21. Word插入点 - **知识点**:在Microsoft Word中,插入点是一个闪烁的垂直光标,指示文档中当前的输入位置。 - **应用...

    JavaGUI编程高级

    通过导入必要的包,如`java.awt.*`、`java.awt.event.*`和`javax.swing.*`,创建菜单和菜单项,然后将它们添加到`JMenuBar`中,并将`JMenuBar`添加到`JFrame`中,最后设置窗口大小并使其可见。 综上所述,JavaGUI...

    2021-2022计算机二级等级考试试题及答案No.175.docx

    3. **热启动的操作**:在计算机处于工作状态时想要重新启动,可以通过热启动实现,即同时按下`Ctrl`、`Del`、`Alt`三个键。这种方法不会强制关闭未保存的文件,因此是一种相对安全的重启方式。 ### Word软件操作 4...

    java源码包---java 源码 大量 实例

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java源码包2

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java源码包3

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java源码包4

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、...

Global site tag (gtag.js) - Google Analytics