当前位置: 首页 > news >正文

《Java核心技术 卷I》用户界面中首选项API

首选项API

在桌面程序中,通常都会存储用户首选项,如用户最后处理的文件、窗口的最后位置等。

利用Properties类可以很容易的加载和保存程序的配置信息,但有以下缺点:

  • 有些操作系统没有主目录概念,很难为匹配文件找到一个统一的位置。
  • 配置文件没有标准命名,用户安装多个Java应用,就更容易发生命名冲突。

操作系统有一个存储配置信息的中心存储库,最著名例子就是Window系统中的注册表。

Preferences类似于一种平台无关的中心存储库,Windows中,Preferences使用注册表存储信息,Linux上信息存储在本地文件系统中。存储库对程序员是透明的。

Preferences有一个树状结构,节点路径类似于/com/mycompany/myapp。

每个节点都有一个单独的键值对表,可存储数值,字符串,字节数组,不建议存储串行化对象。可以有多个树,每个程序用户都有一棵树,类似于操作系统的当前用户概念。

访问数中的一个节点,需要从用户或系统根开始:

Preferences root = Preferences.userRoot();或者

Preferences root = Preferences.systemRoot();

然后访问节点,可以直接提供一个节点路径名:

Preferences node = root.node("/com/mycompany/myapp");

如果节点路径名等于类的包名,可以简便调用:

Preferences node = Preferences.userNodeForPackage(obj.getClass());或

Preferences node = Preferences.systemNodeForPackage(obj.getClass());

一般来说,obj往往是this引用

得到节点,可以用如下方法访问键值表:

String get(String key,String defval)

int getInt(String key,int defval)

double getDouble(String key,double defval)

byte[] getByteArray(String key,byte[] defval)等

读取信息时必须指定一个默认值。

如下put方法向存储库写数据:

put(String key,String value)

putInt(String key,int value)

可以用一下方法枚举一个节点中存储的所有键

String[] keys()

注释:节点名和键都最多只能有80个字符,字符串值最多可以有8192个字符。

类似Windows注册表的中心存储库通常都存在两个问题:

  • 它们会变成充斥着过期信息的垃圾场
  • 配置数据域存储库纠缠在一起,所有很难把首选项迁移到新平台。

提供了第二个问题的解决方案,通过一下方法导出一个子树:

void exportSubtree(OutputStream out)

void exportNode(OutputStream out)

数据用XML格式保存,可以已通过调用一下方法将数据导入到另一个存储库:

void importPreferences(InputStream in)

示例文件,略。

案例:保存窗口位置和文件名,导出首选项后,退出并重启应用,导入首选项,窗口和之前一样,待续。。。

package preferences;import java.awt.EventQueue;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.util.prefs.Preferences;import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;public class ImageViewer {public static void main(String[] args) {EventQueue.invokeLater(()->{var frame = new ImageViewerFrame();frame.setTitle("图片查看器");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);});}
}class ImageViewerFrame extends JFrame {private static final int DEFAULT_WIDTH = 300;private static final int DEFAULT_HEIGHT = 200;private String image;public ImageViewerFrame() {Preferences root = Preferences.userRoot();Preferences node = root.node("/preferences/ImageViewer");int left = node.getInt("left", 0);int top = node.getInt("top", 0);int width = node.getInt("width", DEFAULT_WIDTH);int height = node.getInt("height", DEFAULT_HEIGHT);setBounds(left, top, width, height);image = node.get("image", null);var label = new JLabel();if(image != null) label.setIcon(new ImageIcon(image));addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {node.putInt("left", getX());node.putInt("top", getY());node.putInt("width", getWidth());node.putInt("height", getHeight());node.put("image", image);}});add(label);//安装文件选择器var chooser = new JFileChooser();chooser.setCurrentDirectory(new File("."));//安装菜单栏var menuBar = new JMenuBar();setJMenuBar(menuBar);var menu = new JMenu("文件");menuBar.add(menu);var openItem = new JMenuItem("打开");menu.add(openItem);openItem.addActionListener(event -> {int result = chooser.showOpenDialog(null);if (result == JFileChooser.APPROVE_OPTION) {image = chooser.getSelectedFile().getPath();label.setIcon(new ImageIcon(image));}});var exitItem = new JMenuItem("关闭");menu.add(exitItem);exitItem.addActionListener(event->System.exit(0));}
}

java.util.prefs.Preferences 1.4

  • Preferencs userRoot(),返回调用程序的用户的首选项根节点。
  • Preferences systemRoot(),返回系统范围的首选项根节点。
  • Preferences node(String path),返回从当前节点由给定路径可以到达的节点。如果path是绝对路径(也就是说,以一个/开头),则从包含这个首选项节点的树的根节点开始查找。如果给定路径不存在相应的节点,则创建这样一个节点。
  • Preferences userNodeForPackage(Class cl)
  • Preferences systemNodeForPackage(Class cl),返回当前用户树或系统树中的一个节点,其绝对节点路径对应类cl的包名。
  • String[] keys(),返回属于这个节点的所有键。
  • String get(String key,String defval)
  • int getInt(String key,int defval)
  • long getLong(String key,long defval)
  • float getFloat(String key,float defval)
  • double getDouble(String key,double defval)
  • boolean getBoolean(String key,double defval)
  • byte[] getByteArray(String key, byte[] defval),返回与给定键关联的值,或者如果没有值与这个键关联、关联的值类型不正确或首选项存储库不可用,则返回所提供的默认值。
  • void put(String key, String value)
  • void putInt(String key, int value)
  • void putLong(String key, long value)
  • void putFloat(String key,float value)
  • void putDouble(String key, double value)
  • void putBoolean(String key,boolean value)
  • void putByteArray(String key,byte[] value),在这个节点存储一个值/键对。
  • void exportSubtree(OutputStream out),将这个节点及其子节点的首选项写至指令的流。
  • void exportNode(OutputStream out),将这个节点,不包括其子节点的首选项写至指定的流。
  • void importPreferences(InputStream in),导入指定流中包含的首选项。

相关文章:

《Java核心技术 卷I》用户界面中首选项API

首选项API 在桌面程序中,通常都会存储用户首选项,如用户最后处理的文件、窗口的最后位置等。 利用Properties类可以很容易的加载和保存程序的配置信息,但有以下缺点: 有些操作系统没有主目录概念,很难为匹配文件找到…...

Android 中的 Zygote 和 Copy-on-Write 机制详解

在 Android 系统中,Zygote 是一个关键的进程,几乎所有的应用进程都是通过它 fork(派生)出来的。通过 Zygote 启动新进程的方式带来了显著的性能优势,这得益于 fork 操作和 Linux 中的 Copy-on-Write(COW&am…...

【人工智能】从零开始用Python实现逻辑回归模型:深入理解逻辑回归的原理与应用

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 逻辑回归是一种经典的统计学习方法,用于分类问题尤其是二分类问题。它通过学习数据的特征和目标标签之间的…...

推荐一款功能强大的光学识别OCR软件:Readiris Dyslexic

Readiris Dyslexic是一款功能强大的光学识别OCR软件,可以扫描任何纸质文档并将其转换为完全可编辑的数字文件(Word,Excel,PDF),然后用你喜欢的编辑器进行编辑。该软件提供了一种轻松创建,修改和签名PDF的完整解决方法&…...

Python爬虫----python爬虫基础

一、python爬虫基础-爬虫简介 1、现实生活中实际爬虫有哪些? 2、什么是网络爬虫? 3、什么是通用爬虫和聚焦爬虫? 4、为什么要用python写爬虫程序 5、环境和工具 二、python爬虫基础-http协议和chrome抓包工具 1、什么是http和https协议…...

css-50 Projects in 50 Days(3)

html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>旋转页面</title><link rel"sty…...

另外一种缓冲式图片组件的用法

文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理3. 示例代码4. 内容总结我们在上一章回中介绍了"FadeInImage组件"相关的内容,本章回中将介绍CachedNetworkImage组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的CachedNetwo…...

字节青训-小C的外卖超时判断、小C的排列询问

目录 一、小C的外卖超时判断 问题描述 测试样例 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终代码&#xff1a; 运行结果&#xff1a; 二、小C的排列询问 问题描述 测试样例 最终代码&#xff1a; 运行结果&#xff1a; ​编辑 一、小C的外卖超时判断…...

PHP 伪静态详解及实现方法

概述 在现代 Web 开发中&#xff0c;URL 的设计对用户体验和搜索引擎优化&#xff08;SEO&#xff09;至关重要。动态 URL 虽然功能强大&#xff0c;但往往显得冗长且不友好。伪静态&#xff08;URL 重写&#xff09;技术通过将动态 URL 转换为静态样式&#xff0c;不仅提高了…...

Spring Boot 简单预览PDF例子

目录 前言 一、引入依赖 二、使用步骤 1.创建 Controller 处理 PDF 生成和预览 2.创建预览页面 总结 前言 使用 Spring Boot 创建一个生成 PDF 并进行预览的项目&#xff0c;你可以按以下步骤进行。我们将使用 Spring Boot、Thymeleaf、iText 等技术来完成这个任务。 一、引入…...

【魔珐有言-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…...

LabVIEW 使用 Snippet

在 LabVIEW 中&#xff0c;Snippet&#xff08;代码片段&#xff09; 是一个非常有用的功能&#xff0c;它允许你将 一小段可重用的代码 保存为一个 图形化的代码片段&#xff0c;并能够在不同的 VI 中通过拖放来使用。 什么是 Snippet&#xff1f; Snippet 就是 LabVIEW 中的…...

单片机_day3_GPIO

目录 1. 灯如何才能亮 1.1原理图 1.2 二极管 1.3 换了一个灯和原理图 ​编辑 1.4 三极管 1.4.1 NPN型三极管 1.4.2 PNP型三极管 2. 基本概念 3. 输入 3.1 浮空输入 3.2 上拉输入 3.3 下拉输入 3.4 模拟输入 4. 输出 4.1 推挽输出 4.2 开漏输出 如何让开漏输出…...

Python小游戏24——小恐龙躲避游戏

首先&#xff0c;你需要安装Pygame库。如果你还没有安装&#xff0c;可以通过以下命令安装&#xff1a; 【bash】 pip install pygame 【python】代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen …...

Python 的多态笔记

Python的多态实际是通过instance 实现的 class Person:def __init__(self, name,age):self.name nameself.age agedef feed_pet(self,pet):#isinastance(obj,类)-->判断obj,是不是这个类的对象&#xff0c;或者判断obj是不是该类的子类的对象if isinstance(pet, Pet):sel…...

go module使用

go module介绍 go module是go官⽅⾃带的go依赖管理库,在1.13版本正式推荐使⽤ go module可以将某个项⽬(⽂件夹)下的所有依赖整理成⼀个 go.mod ⽂件,⾥⾯写⼊了依赖的版本等 使⽤ go module之后我们可不⽤将代码放置在src下了 使⽤ go module 管理依赖后会在项⽬根⽬录下⽣成…...

c ++零基础可视化——数组

c 零基础可视化 数组 一些知识&#xff1a; 关于给数组赋值&#xff0c;一个函数为memset&#xff0c;其在cplusplus.com中的描述如下&#xff1a; void * memset ( void * ptr, int value, size_t num );Sets the first num bytes of the block of memory pointed by ptr to…...

CVE-2024-2961漏洞的简单学习

简单介绍 PHP利用glibc iconv()中的一个缓冲区溢出漏洞&#xff0c;实现将文件读取提升为任意命令执行漏洞 在php读取文件的时候可以使用 php://filter伪协议利用 iconv 函数, 从而可以利用该漏洞进行 RCE 漏洞的利用场景 PHP的所有标准文件读取操作都受到了影响&#xff1…...

计算机组成原理笔记----基础篇

计算机系统硬件软件 软件 ├── 系统软件 │ ├── 操作系统 │ └── 工具软件 └── 应用软件├── 办公软件├── 媒体软件└── 浏览器软件硬件 ├── 计算机硬件 │ ├── 中央处理器&#xff08;CPU&#xff09; │ ├── 存储设备 │ │ ├── …...

TheadLocal出现的内存泄漏具体泄漏的是什么?弱引用在里面有什么作用?什么情景什么问题?

首先ThreadLocal是什么就不介绍了&#xff01;这篇是讲讲里面的东西。 再简单说一下强引用和弱引用&#xff0c;举个例子&#xff0c;我们平常new出来的对象就是强引用的&#xff0c;在栈中有强引用&#xff0c;所以在gc的时候&#xff0c;堆中的实例对象不会被清除掉。 弱引…...

接地系统安装怎么做才靠谱?从施工流程、质量验收到常见误区

在建筑电气、工业厂房、机电安装、弱电机房、消防系统和防雷系统中&#xff0c;接地系统安装都是绕不开的基础工作。它不像配电柜、桥架、灯具那样“看得见、拍得出”&#xff0c;但它一旦做不好&#xff0c;轻则设备故障、信号干扰、漏电保护误动作&#xff0c;重则引发触电风…...

ChatTTS一键启动:从零搭建语音合成服务的实战指南

语音合成服务在现代应用中扮演着越来越重要的角色。它被广泛应用于智能客服、有声读物生成和视频内容配音等场景。通过将文本转化为自然流畅的语音&#xff0c;极大地提升了人机交互的体验和应用的可访问性。 然而&#xff0c;对于希望快速部署ChatTTS这类先进语音合成模型的开…...

快速上手ANIMATEDIFF PRO:从环境部署到视频导出的完整操作流程

快速上手ANIMATEDIFF PRO&#xff1a;从环境部署到视频导出的完整操作流程 1. 环境准备与快速部署 1.1 硬件要求检查 在开始之前&#xff0c;请确保您的设备满足以下最低配置要求&#xff1a; 显卡&#xff1a;NVIDIA RTX 3060及以上&#xff08;推荐RTX 4090&#xff09;显…...

使用 Java 泛型创建 CSV 到对象的转换器

本文将介绍如何使用它 Java 创建一个通用的泛型 CSV 文件到 Java 对象转换器。通过泛型&#xff0c;我们可以避免为每个需要转换的类别编写重复的代码&#xff0c;以实现代码的重用和简化。本文将提供示例代码&#xff0c;并讨论一些关于代码设计和最佳实践的建议&#xff0c;以…...

告别代码恐惧!用KRobot图形化编程,10分钟搞定Arduino巡线小车(附完整接线图)

零代码玩转Arduino巡线小车&#xff1a;KRobot图形化编程全攻略 第一次接触Arduino时&#xff0c;看到满屏的C代码是不是头皮发麻&#xff1f;作为教育工作者或创客爱好者&#xff0c;你可能更希望把时间花在创意实现上&#xff0c;而不是纠结于语法错误。现在&#xff0c;通过…...

2K2000龙芯主板以科技创新为驱动力,赋能产业高质量发展

当前&#xff0c;新一轮科技革命和产业变革深入演进&#xff0c;科技创新已成为引领产业高质量发展的核心引擎&#xff0c;更是实现高水平科技自立自强、掌握产业发展主动权的关键支撑。科技创新作为新质生产力的核心驱动力&#xff0c;早已成为引领产业高质量发展的“第一引擎…...

如何快速掌握KLayout:专业版图设计的终极实战指南

如何快速掌握KLayout&#xff1a;专业版图设计的终极实战指南 【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout KLayout是一款功能强大的开源版图设计工具&#xff0c;专门用于集成电路&#xff08;IC&#xff09;和…...

HY-Motion 1.0在元宇宙中的应用:虚拟世界角色动画生成

HY-Motion 1.0在元宇宙中的应用&#xff1a;虚拟世界角色动画生成 1. 元宇宙里&#xff0c;角色为什么需要“活”起来 打开一个元宇宙应用&#xff0c;你看到的可能是一个精致的虚拟空间&#xff0c;但真正让人愿意停留的&#xff0c;从来不是静态的场景&#xff0c;而是能动…...

ncmdumpGUI:实现NCM格式自由转换的音频解决方案

ncmdumpGUI&#xff1a;实现NCM格式自由转换的音频解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 痛点剖析&#xff1a;NCM格式的技术民主化阻碍 格…...

ViGEmBus虚拟控制器驱动架构深度解析与高级配置实战指南

ViGEmBus虚拟控制器驱动架构深度解析与高级配置实战指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus作为Windows内核模式虚拟控制器驱动&#x…...