编程语言
首页 > 编程语言> > Java中的JSpinner.DateEditor在初始化时不尊重TimeZone

Java中的JSpinner.DateEditor在初始化时不尊重TimeZone

作者:互联网

我正在为使用Java日期和Swing的JSpinner作为DateEditor的现有Swing应用程序进行错误修复.我正在尝试使编辑器默认为使用UTC来显示时间,而不是我们的本地时区.该应用程序使用Java 8在Windows上运行.

我正在使用的代码如下.

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;

    public class Test {

    public static void main(String [] args) {
        // Initialize some sample dates
        Date now = new Date(System.currentTimeMillis());


        JSpinner spinner = new JSpinner();

        // Create model with a current date and no start/end date boundaries, and set it to the spinner
        spinner.setModel(new SpinnerDateModel(now, null, null, Calendar.MINUTE));

        // Create new date editor with a date format string that also displays the timezone (z)
        // Set the format's timezone to be UTC, and finally set the editor to the spinner
        JSpinner.DateEditor startTimeEditor = new JSpinner.DateEditor(spinner, "yyyy-MMM-dd HH:mm zzz");

        startTimeEditor.getFormat().setTimeZone(TimeZone.getTimeZone("UTC"));
        spinner.setEditor(startTimeEditor);

        JPanel panel = new JPanel();
        panel.add(spinner);
        JOptionPane.showConfirmDialog(null, panel);
    }

}

但是,此代码存在初始化问题.对话框首次出现时,时间以我们当地的时区而非UTC显示.一旦用户首先通过单击与该字段进行交互,它将切换到UTC并从此正常工作.

如何使该字段最初显示在UTC时间?

解决方法:

有趣的错误.一种适用于我的解决方法是将微调框的初始值设置为new Date(0)(即1970年1月1日),然后在调整编辑器后调用spinner.setValue(new Date()).

真正的问题是Spinner似乎并没有根据editor属性的更改来更新其文本.实际上,JSpinner文档建议Editor属性根本不是绑定属性.因此,另一个解决方法是在更改编辑器时强制更新Spinner:

SpinnerModel model = new SpinnerDateModel(now, null, null, Calendar.MINUTE);
JSpinner spinner = new JSpinner(model) {
    @Override
    public void setEditor(JComponent editor) {
        super.setEditor(editor);
        fireStateChanged();
    }
};

标签:jspinner,swing,java,date
来源: https://codeday.me/bug/20191027/1941074.html