2016-05-25 5 views
3

Я работаю над исправлением существующего приложения Swing, использующего даты Java и JSpinner Swing как DateEditor. Я пытаюсь заставить редактор по умолчанию использовать UTC для отображения времени, а не нашего локального часового пояса. Приложение работает в Windows с использованием Java 8.JSpinner.DateEditor в Java Не соблюдает TimeZone при инициализации

Код, который я использую, приведен ниже.

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?

ответ

4

Интересная ошибка. Обходной путь, который работает для меня, заключается в том, чтобы установить начальное значение счетчика как-то вроде new Date(0) (это 1 января 1970 года), затем после настройки редактора вызовите spinner.setValue(new Date()).

Настоящая проблема заключается в том, что Spinner, похоже, не обновляет свой текст в ответ на изменение свойства редактора. Фактически, документация 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(); 
    } 
}; 
+0

Спасибо, это одно возможное обходное решение, которое мы рассматриваем. Но это выглядело скорее как взлома, поэтому мы хотели посмотреть, есть ли более правильный способ сделать это, прежде чем мы остановимся на этом как на обходной путь. – JohnnyO

+0

@JohnnyO Добавлен другой обходной путь. К сожалению, до сих пор это хак. Я не знаю, что любое стандартное использование JSpinner заставит его обновляться на основе изменений в редакторе. – VGR

 Смежные вопросы

  • Нет связанных вопросов^_^