《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),导入指定流中包含的首选项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/17478.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

win10海量文件拷贝的方法

文章目录 win10海量文件拷贝的方法概述笔记备注拷贝失败的情况记录杀毒软件拦截 是否要开启"发生错误继续"的选项还是不要开启"完美校验"可以勾选"错误时继续"选项"完美校验"太占用时间了备注日志是混合编码的总结END win10海量文件拷…

Linux——环境基础开发工具使用1

目录 1.软件包管理器 1.1 操作生态系统 1.2 yum具体操作 2.编辑器Vim 2.1 vim初识 2.2 vim的基本概念 2.3 vim的基本操作 2.3.1 命令模式 2.3.2 插入模式 2.3.3 底行模式 2.3.4 补充 3.编译器gcc/g 3.1 背景知识 3.1.1 预处理(进行宏替换/去注释/…

自定义菜单栏实现点击添加按钮打开渲染进程的Dialog.vue模态框

实现思路:渲染进程页面初始化后就通知主进程,然后把event事件保存在该js文件外,当点击添加时因为是在其他位置,所以才要这样使用。然后点击添加后由主进程主动向渲染进程传递参数通知要做的操作。 代码如下: // 第一步…

[vulnhub] Chronos: 1

https://www.vulnhub.com/entry/chronos-1,735/ ps:该靶机需要在hosts文件添加chronos.local记录,在官方地址上没有写 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的,所以靶机IP是7 ,kali是10 nmap -sP 1…

基于SSM的餐饮管理系统的设计与实现

【Java】基于SSM的餐饮管理系统的设计与实现 点击以下链接获取源码: https://download.csdn.net/download/qq_64505944/90001206?spm1001.2014.3001.5503 2、技术框架:Jdk1.8,SSM,Tomcat,Mysql5,Jsp 3、压…

数据结构之集合框架

文章目录 1.什么是集合框架2. 集合框架的重要性(了解)3. 背后涉及到的数据结构以及算法3.1 什么是数据结构3.2 相关Java知识3.3 什么是算法 1.什么是集合框架 Java 集合框架 Java Collection Framework ,又被称为容器 container &#xff0c…

【大语言模型】ACL2024论文-14 任务:不可能的语言模型

【大语言模型】ACL2024论文-14 任务:不可能的语言模型 目录 文章目录 【大语言模型】ACL2024论文-14 任务:不可能的语言模型目录摘要研究背景问题与挑战如何解决创新点算法模型实验效果重要数据与结论推荐阅读指数和推荐理由 后记 任务:不可能…

PFC(Priority-based Flow Control) 的 100 种优化方法

简单直接的东西不需要优化,只有弄巧成拙的东西才不断被修补,优化,没完没了。 昨天聊 RDMA 和无损网络,我还是一如既往喷 PFC,并提出一些等价想法,被怼异想天开。随后我换了群昵称和头像,若干分…

【网络】什么是路由器 (Router )网关设备(Gateway)?

路由器(Router),又称路径器或网关设备(Gateway),是一种重要的计算机网络设备。以下是关于路由器的详细解释: 一、路由器的定义与功能 定义:路由器是连接因特网中各局域网、广域网的…

Linux debian系统安装ClamTk开源图形用户界面(GUI)杀毒软件

一、ClamTk简介 ClamTk 是一个基于 ClamAV 的开源图形用户界面(GUI)杀毒软件。它使用 GTK2-Perl 脚本构建而成,支持32位与64位操作系统。ClamTk 提供了一个直观的用户界面,使得用户无需深入了解命令行即可完成大部分操作。它具备…

Java期末复习暨学校第八次上机课作业

Java期末复习暨学校第八次上机课作业: 第一题: 分别给出了一个无参构造方法和有参构造方法,然后针对半径给出了set和get方法。针对面积给出了getArea方法,返回面积的值。 针对周长给出getPerimeter方法,返回周长。最后…

ShardingSphere如何轻松驾驭Seata柔性分布式事务?

0 前文 上一文解析了 ShardingSphere 强一致性事务支持 XAShardingTransactionManager ,本文继续: 讲解该类介绍支持柔性事务的 SeataATShardingTransactionManager sharding-transaction-xa-core中关于 XAShardingTransactionManager,本文…

将 SQL 数据库连接到云:PostgreSQL、MySQL、SQLite 和云集成说明

在当今数据驱动型世界中,云技术已经完全改变了数据库的管理和扩展。SQL 数据库(包括 PostgreSQL、MySQL 和 SQLite)在相当长的一段时间内一直是开发人员的最爱。然而,为了响应对可扩展、适应性强且经济高效的解决方案日益增长的需…

Vulnhub靶场案例渗透[10]- Momentum2

文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 扫描网络目录结构4. 代码审计5. 反弹shell6. 提权 一、靶场搭建 1. 靶场描述 - Difficulty : medium - Keywords : curl, bash, code reviewThis wor…

STM32设计防丢防摔智能行李箱

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展,嵌入式系统、物联网技术、智能设备…

前后端请求响应

引入 在之前的例子中,我们编写了一个简单的web类,我们运行启动类,启动内嵌的tomcat后就可以在浏览器通过特定的路径访问tomcat中的应用程序。 但之前编写的程序仅仅是个简单的java类,其并未实现某个接口或继承某个类&…

爬虫——数据解析与提取

第二节:数据解析与提取 在网络爬虫开发中,获取网页内容(HTML)是第一步,但从这些内容中提取有用的数据,才是爬虫的核心部分。HTML文档通常结构复杂且充满冗余信息,因此我们需要使用高效的解析工…

数据结构C语言描述3(图文结合)--双链表、循环链表、约瑟夫环问题

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…

设计模式-策略模式

1. 策略模式 策略模式(Strategy Pattern)针对一组算法,将每一个算法封装到 具有共同接口 的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。 在软件开发中,经常会遇到…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,

也就是将摄像头采集到的YUV 的数据换成 AVFrame,然后再次转成 AVPacket,那么这AVPakcet数据要怎么办呢?分为三种情况: 一种是将AVPacket存储成h264文件,由于h264编码器在将avframe变成avpacket的时候就是按照h264的格…