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 必须包含年份,即使开始和结束是同一年 的相关文章

随机推荐

  • 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