JavaBeans как компонент виджета
(я изучаю Java и Java бинов)
Насколько я знаю, используя JavaBeans как компонент в инструментах визуального дизайна никогда не завоевывал популярность. Я удивлен, что NetBeans все еще поддерживает это. Я рекомендую вам не тратить слишком много времени или усилий на этот аспект технологии JavaBean.
java .time
по умолчанию отображается дата система (я запрограммировал бин для работы таким образом).
Вы используете ужасные классы даты и времени, которые были заменены годами go современными java .time классы, определенные в JSR 310.
Никогда не используйте Date
или SimpleDateFormat
. Если вам необходимо взаимодействовать со старым кодом, который еще не обновлен до java .time , выполните все свои логи c в java .time и в конце выполните преобразование, используя новые методы добавлены к старым классам.
Для значения только для времени дня, без даты и без часового пояса, используйте LocalTime
.
Часовой пояс
Получение текущего времени суток подразумевает получение текущего момента. И это требует часового пояса. В любой момент времени дата и время суток меняются по всему земному шару в зависимости от часового пояса.
Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться. Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента. Если вы хотите использовать текущий часовой пояс JVM по умолчанию, проясните свое намерение, позвонив по номеру ZoneId.systemDefault()
. Если критично, подтвердите зону с вашим пользователем.
Укажите правильное имя часового пояса в формате Continent/Region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
, Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalTime lt = LocalTime.now( z ) ;
Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его явно и передайте в качестве аргумента. Если опущен, код становится неоднозначным для чтения, поскольку мы точно не знаем, намеревались ли вы использовать значение по умолчанию или если вы, как и многие другие программисты, не знали об этой проблеме.
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
LocalTime lt = LocalTime.now( z ) ;
Если это содержание имеет решающее значение, вы должны подтвердить часовой пояс с пользователем. По умолчанию система может не соответствовать намерениям пользователя, особенно если учесть, что мобильные устройства и ноутбуки легко перемещаются между часовыми поясами. В таком случае вы должны сохранить объект ZoneId
в качестве поля члена в вашем классе виджетов или в другом месте, доступном для виджета.
Так что если разработчик вставит компонент в новый проект текст должен быть временем системы.
Вы можете анализировать вводимый пользователем текст. Если в стандартном формате ISO 8601 , ЧЧ: ММ: СС с 24-часовыми часами, вам не нужно беспокоиться об указании шаблона форматирования. Классы java .time по умолчанию используют стандартные форматы при разборе / генерации текста.
String input = "23:01:23" ;
LocalTime lt = LocalTime.parse( input ) ;
Если вы хотите локализовать отображаемый текст, представляющий значение нашего LocalTime
объект, используйте DateTimeFormatter
. Укажите Locale
, чтобы определить человеческий язык и культурные нормы , используемые при локализации . И укажите FormatStyle
, чтобы сказать, как долго или сокращенно.
Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM ) ;
Поиск, чтобы узнать больше. Об этом уже много раз говорилось о переполнении стека.
Dynami c update
Остальная часть вашего кода немного смущает меня. Похоже, вы хотите обновить часы до текущего момента, постоянно обновляясь. Тем не менее, вы также позволяете пользователю изменять время. Это противоречиво.
Я подозреваю, что вы действительно хотите, чтобы две части, работающие вместе: отображение времени суток и часовой пояс. Если вы пытаетесь разрешить пользователю смещать отображение часов в соответствии со своим часовым поясом, вы должны сделать это, позволив пользователю указать часовой пояс (как обсуждалось выше). Другими словами, смещение часов должно быть следствием, а не причиной. Пользователь управляет свойством часового пояса, и часы автоматически изменяют свое время, как видно из смещения, используемого людьми региона, представленного этим часовым поясом.
Другая проблема: обновление Periodi c. Вы используете Timer
и TimerTask
, два класса, которые были заменены структурой Executor . В частности, в Swing вы должны использовать класс javax.swing.Timer
(см. Tutorial ), а не java.util.Timer
.
Обязательное предупреждение: никогда не открывайте, не обновляйте и не манипулируйте виджетами Swing из фонового потока. Делайте это только в потоке пользовательского интерфейса.
Пример приложения
Вот простой и быстрый пример приложения Swing. Это не компонент JavaBean. И я мало что помню о Swing. Но это может немного помочь вам. Вы можете видеть, как изменение часового пояса (ZoneId
) обновляет время суток, смещая его к смещению, действующему в настоящее время в этой зоне.
package org.example;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.DateTimeException;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;
/**
* Hello world!
*/
public class App extends JFrame
{
ZoneId zoneId;
LocalTime localTime;
JTextField timeZone;
JLabel displayTime;
DateTimeFormatter formatter;
public App ( )
{
initUI();
}
private void initUI ( )
{
setTitle( "Simple example" );
setSize( 300 , 200 );
setLocationRelativeTo( null );
setDefaultCloseOperation( EXIT_ON_CLOSE );
// Widgets
this.zoneId = ZoneId.systemDefault();
this.timeZone = new JTextField( this.zoneId.getId() , 20 );
this.localTime = LocalTime.now( this.zoneId );
Locale locale = Locale.CANADA_FRENCH;
this.formatter = DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM );
this.displayTime = new JLabel( this.localTime.format( this.formatter ) );
this.timeZone.addActionListener( new ActionListener()
{
@Override
public void actionPerformed ( ActionEvent event )
{
System.out.println( "The entered text is: " + timeZone.getText() );
try
{
zoneId = ZoneId.of( timeZone.getText() );
localTime = LocalTime.now( zoneId );
String output = LocalTime.now( zoneId ).format( formatter );
displayTime.setText( output );
}
catch ( DateTimeException e )
{
System.out.println( "BAD INPUT - The user gave an invalid time zone: " + timeZone );
}
}
} );
// Arrange
JPanel panel = new JPanel();
panel.add( this.displayTime );
panel.add( this.timeZone );
this.add( panel );
}
public static void main ( String[] args )
{
EventQueue.invokeLater( ( ) -> {
var ex = new App();
ex.setVisible( true );
} );
}
}
О java .time
В java .time встроен фреймворк Java 8 и позже. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Чтобы узнать больше, см. Учебник Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация: JSR 310 .
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java .time классы.
Вы можете обмениваться java .time объектами непосредственно с вашей базой данных. Используйте драйвер JDB C , совместимый с JDB C 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где взять классы java .time?
ThreeTen-Extra Проект расширяет java .time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java .time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .