JSpinner.DateEditor 必须包含年份,即使开始和结束是同一年

2023-11-23

我有一个使用 SpinnerDateModel 的 JSpinner,其开始日期为 2010 年 1 月 1 日 00:00:00.000,结束日期为 2010 年 1 月 1 日 00:12:34.217。我希望我的 JSpinner.DateEditor 使用格式 HH:mm:ss.SSS 但微调器不会以这种格式旋转。仅当将“yyyy”添加到格式中时才会旋转。我该如何解决这个问题?

import java.awt.GridLayout;
import java.util.*;
import javax.swing.*;

public class T extends JPanel {

    public T() {
        super(new GridLayout(2, 2));
        init();
    }

    private void init() {
        Calendar start = GregorianCalendar.getInstance();
        Calendar end = GregorianCalendar.getInstance();
        start.clear();
        end.clear();
        start.set(Calendar.YEAR, 2010);
        end.set(Calendar.YEAR, 2010);
        end.add(Calendar.HOUR_OF_DAY, 12);
        SpinnerDateModel m1 =
                new SpinnerDateModel(start.getTime(), start.getTime(),
                end.getTime(), Calendar.MILLISECOND);
        SpinnerDateModel m2 =
                new SpinnerDateModel(start.getTime(), start.getTime(),
                end.getTime(), Calendar.MILLISECOND);
        JSpinner workingSpinner = new JSpinner(m1);
        workingSpinner.setEditor(
                new JSpinner.DateEditor(workingSpinner,
                "yyyy HH:mm:ss.SSS"));
        JSpinner notWorkingSpinner = new JSpinner(m2);
        notWorkingSpinner.setEditor(
                new JSpinner.DateEditor(notWorkingSpinner,
                "HH:mm:ss.SSS"));
        add(new JLabel("Working"));
        add(workingSpinner);
        add(new JLabel("!Working"));
        add(notWorkingSpinner);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new T());
        frame.pack();
        frame.setVisible(true);
    }
}

在深入研究 JRE 源代码后,我发现微调器由文本值而不是真实日期支持。当您点击向上和向下旋转按钮时,系统会解析该值,然后与最小值和最大值进行比较。由于您的格式没有年份,因此解析日期时的年份始终为 1970 年,即距纪元的偏移量为 0 的年份。这会导致当您尝试旋转旋转器时,旋转器始终返回超出范围的错误。

最快的解决方案就是简单地使用 1970 年而不是 2010 年作为您的年份。但是,如果您的初始日期是 1970 年底,则旋转器不会让您的用户滚动到 1971 年 1 月(相反,它可能会跳回 1970 年初) 。

另一种解决方案可以容纳跨越日历年边界的日期。然而,它并不那么简单(或漂亮)。在 JRE 中,当 DateFormatter 解析日期字符串时,它会使用单个 String 参数构造函数动态实例化一个类。该字符串是来自微调器的日期。默认情况下,此类是 Date 或其某个子类。我们可以让格式化程序实例化我们自己的 Date 类,该类在执行任何日期比较之前修复年份。


添加年份的日期类:

public static class DateThatAddsYear extends Date {
 public DateThatAddsYear( String time ) {
  super( time );
  Calendar cal = GregorianCalendar.getInstance();
  cal.setTime( this );
  // Jump back to 2010, this needs to be implemented more thoroughly in order 
  // to support dates crossing calendar year boundaries
  cal.set( Calendar.YEAR, 2010 );
  setTime( cal.getTimeInMillis() );
 }
}

使用我们的日期修复手动设置微调器:

JSpinner notWorkingSpinner = new JSpinner(m2);
JSpinner.DateEditor dateEditor = new JSpinner.DateEditor(notWorkingSpinner);
DateFormatter formatter = new DateFormatter( format );
notWorkingSpinner.setEditor(dateEditor);
dateEditor.getTextField().setFormatterFactory( new DefaultFormatterFactory( formatter ) );
formatter.setValueClass( DateThatAddsYear.class ); // Tell it to use a different value class!

丑陋,但它有效。

另外,如果您想浏览 JRE 源代码,我建议您查看 public 方法stringToValue(String text)InternationalFormatter(DateFormatter 的超类)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSpinner.DateEditor 必须包含年份,即使开始和结束是同一年 的相关文章

  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn

随机推荐

  • dlopen 对于同一文件的两次调用会产生相同的句柄吗?

    如果我在同一个应用程序运行中对同一个库 文件使用 dlopen 两次 在这两种情况下它会产生相同的句柄吗 对此有任何保证吗 一个简短的实验表明它至少在我的盒子上如此 我目前正在玩一个小插件系统 出于好奇 如果对这种观察到的行为有某种保证 我
  • 如何使用 mplot3D 或类似工具显示 3D 阵列等值面的 3D 图

    我有一个 3 维 numpy 数组 我想 在 matplotlib 中 显示该数组的等值面的漂亮 3D 图 或更严格地说 显示通过在样本点之间插值定义的 3D 标量场的等值面 matplotlib 的 mplot3D 部分提供了很好的 3D
  • Promise 带有递归

    我看了一些关于承诺中的递归的问题 并对如何正确实现它们感到困惑 JavaScript 中的递归 Promise AngularJS 承诺具有递归功能 递归链接 Promise Javascript 递归 Promise 我整理了一个简单的例
  • php获取变量作为键,但没有分配值

    如果我在浏览器中输入以下内容 http domain com script php 1234 script php 有以下脚本 key array keys GET echo key 0 输出将是 1234 我正在尝试消除丑陋的 r 123
  • Python 3 写入管道

    我正在尝试编写一些代码将数据放入管道中 并且我希望该解决方案与 python 2 6 和 3 x 兼容 例子 from future import print function import subprocess import sys if
  • R 脚本行号错误? [复制]

    这个问题在这里已经有答案了 我找到了这个post从一年前开始 我正在使用R version 2 11 1 2010 05 31 但仍然收到没有行号的错误消息 有什么解决办法吗 那里给出的答案仍然有效 从脚本返回行号并不是那么简单 但是 R
  • C++ 中指针的值初始化到底有什么作用?

    我看过相关答案here and here对此 但我想要确认 因为他们都没有明确说明这一点 假设我有一堂课Foo和一名会员bar类型的int 以下两个初始化完全等效吗 Foo Foo bar NULL null pointer constan
  • “应用程序安装失败:无法检查应用程序包”

    当从 Xcode 到我的 iPhone 进行构建和运行时 Xcode 不断地给我这个错误 在它给我错误后 没有控制台错误 我可以再次运行它 一切都很好 部署到设备上没有问题 我不知道如何解决这个问题 我已经尝试过问题中的解决方案here h
  • 如何获取上个月数据和本月至今数据

    需要帮助编写查询以获取上个月的数据以及本月至今的数据 如果今天的日期是2011年3月23日 我需要检索上个月的数据以及直到今天的数据 指2011年3月23日 如果日期为 2011 年 4 月 3 日 则数据应包含 3 月数据和截至 2011
  • 错误 2006:使用 Python、Bottle Microframework 和 Apache 时“MySQL 服务器已消失”

    使用以下方式访问我的网络应用程序后 Python 2 7 Bottle 微框架 v 0 10 6 阿帕奇 2 2 22 mod wsgi 在 Ubuntu Server 12 04 64 位上 几个小时后我收到此错误 Operational
  • 在 Nuget 中为 PackageReferece 项目打包静态内容

    我有一个类库 net47 项目 我想将我的 dll 和几个静态内容文件 js css 图像 打包到 nuget 中 我想使用这个 dll 和消费者项目的内容 这些项目将是 MVC PackageReference 项目 在这些项目中 本地静
  • hadoop hdfs 格式化块池出现错误失败

    格式化 hdfs 后 出现以下错误 2015 05 28 21 41 57 544 WARN org apache hadoop hdfs server common Storage java io IOException Incompat
  • 如何使用自制程序中的 openSSL 在 macOS 上编译 Python 3.6.2?

    我正在尝试根据 macOS 10 11 上的说明编译 Python 3 6 2https bugs python org issue29095 我使用自制程序将 openSSL 安装到标准位置 然后将 LDFLAGS CFLAGS 和 CP
  • 如何使用 Python 将 SQL IN 子句格式化为字符串

    我正在尝试创建如下声明 SELECT FROM table WHERE provider IN provider1 provider2 但是 我在 Django API 的字符串格式化方面遇到了一些问题 这是我到目前为止所拥有的 profi
  • WCF 数据服务:如何避免 __metadata 成员

    我目前正在尝试使用 WCF 数据服务来进一步开放我们的产品 同时能够使用来自 AJAX 的数据 我注意到的一件事是 JSON 表示格式将这些 metada 成员散布在数据中 并且在 OData 文档中我发现了这一点 在代表条目 可选的 me
  • && 的优先级高于 || [复制]

    这个问题在这里已经有答案了 据我所知逻辑运算符 优先级高于 运行代码时 include
  • 树莓派Qt5设置物理屏幕尺寸

    我正在使用交叉编译在 raspbian 上的树莓派上开发 qt5 应用程序 当我运行它时 我得到一个黑屏 试图显示一个 QFrame 弹出窗口 我想它无法定位 因为我在开头收到了错误消息 EGLFS 无法查询物理屏幕尺寸 默认为100 dp
  • 为什么 '.sort()' 会导致 Python 中的列表为 'None'? [复制]

    这个问题在这里已经有答案了 我正在尝试对 Python 列表进行排序ints 然后使用 pop 函数返回最高的一个 我尝试过以不同的方式编写该方法 def LongestPath T paths Ancestors T x for x in
  • 计算出一天已过去的百分比

    有点奇怪的问题 但希望有人能帮忙 本质上 如果时间是中午 12 点 则经过百分比为 50 上午 6 点为 25 下午 16 点为 75 给定当前时间 您如何计算出已经过去了多少天 假设您可以获得一天中的当前时间 那么计算一天过去的百分比将非
  • JSpinner.DateEditor 必须包含年份,即使开始和结束是同一年

    我有一个使用 SpinnerDateModel 的 JSpinner 其开始日期为 2010 年 1 月 1 日 00 00 00 000 结束日期为 2010 年 1 月 1 日 00 12 34 217 我希望我的 JSpinner D