JFormattedTextField: значение времени ввода времени
-
19-09-2019 - |
Вопрос
Я хочу использовать JFormattedTextField
чтобы позволить пользователю вводить время продолжительность значения в форму. Пример допустимых значений:
2h 30m
72h 15m
6h
0h
Однако я имею ограниченный успех с этим. Может кто -нибудь, пожалуйста, предложить, как это можно сделать? Я в порядке, если этот результат может быть достигнут с помощью JTextField
также.
Спасибо!
Если это что -то стоит, вот моя текущая попытка:
mFormattedText.setFormatterFactory(
new DefaultFormatterFactory(
new DateFormatter(
new SimpleDateFormat("H mm"))));
Это работает, кроме этого:
Я не могу получить*h
а такжеm
появиться как простой текст (я пытался сбежать)- Количество часов имеет макс.
*: Смотрите ответ @Нанда
Решение
Код:
public static void main(String[] args) {
JFrame jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setLayout(new BorderLayout());
jFrame.setPreferredSize(new Dimension(500, 500));
final JFormattedTextField comp = new JFormattedTextField();
comp.setFormatterFactory(new DefaultFormatterFactory(new DateFormatter(new SimpleDateFormat(
"H'h' mm'm'"))));
comp.setValue(Calendar.getInstance().getTime());
comp.addPropertyChangeListener("value", new PropertyChangeListener() {
@Override public void propertyChange(PropertyChangeEvent evt) {
System.out.println(comp.getValue());
}
});
jFrame.getContentPane().add(comp, BorderLayout.CENTER);
jFrame.pack();
jFrame.setVisible(true);
}
Другие советы
Вот пример использования InputVerifier
для размещения нескольких входных форматов.
import java.awt.EventQueue;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.Box;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.text.DateFormatter;
import javax.swing.text.DefaultFormatterFactory;
public class FormattedFields {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
//@Override
public void run() {
new FormattedFields();
}
});
}
FormattedFields() {
Box form = Box.createVerticalBox();
form.add(new JLabel("Date & Time:"));
DateTimeField dtField = new DateTimeField(new Date());
form.add(dtField);
form.add(new JLabel("Amount:"));
JFormattedTextField amtField = new JFormattedTextField(
NumberFormat.getCurrencyInstance());
amtField.setValue(100000);
form.add(amtField);
JFrame frame = new JFrame();
frame.add(form);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class DateTimeField extends JFormattedTextField {
public DateTimeField() {
super(DateTimeVerifier.getDefaultFormat());
this.setInputVerifier(new DateTimeVerifier(this));
}
public DateTimeField(Date date) {
this();
this.setValue(date);
}
@Override
protected void invalidEdit() {
if (!this.getInputVerifier().verify(this)) {
super.invalidEdit();
}
}
}
class DateTimeVerifier extends InputVerifier {
private static List<SimpleDateFormat> validForms =
new ArrayList<SimpleDateFormat>();
static {
validForms.add(new SimpleDateFormat("dd-MMM-yyyy HH'h':mm'm'"));
validForms.add(new SimpleDateFormat("dd-MMM-yyyy HH:mm"));
}
private JFormattedTextField tf;
private Date date;
public DateTimeVerifier(JFormattedTextField tf) {
this.tf = tf;
}
@Override
public boolean verify(JComponent input) {
boolean result = false;
if (input == tf) {
String text = tf.getText();
for (SimpleDateFormat format : validForms) {
try {
date = format.parse(text);
result |= true;
} catch (ParseException pe) {
result |= false;
}
}
}
return result;
}
@Override
public boolean shouldYieldFocus(JComponent input) {
if (verify(input)) {
tf.setValue(date);
return true;
} else {
return false;
}
}
public static SimpleDateFormat getDefaultFormat() {
return validForms.get(0);
}
}
Ты пытался H'h' mm'm'
?
Хм, я думаю, что вы можете достичь одной и той же цели, создавая три разных JTextfield для всех трехкратных компонентов, один для часа, минуты и второй (если он включен), чтобы получить ваш ввод ... просто мысль, Вы могли бы просто объединить их, если вам это необходимо ... просто мысль ...
TL; DR
Duration.parse( "PT2H30M" )
ISO 8601
Если вы готовы переопределить желаемые входные форматы, я предлагаю использовать уже существующие форматы, определенные ISO 8601 стандартный
Шаблон PnYnMnDTnHnMnS
использует P
Чтобы отметить начало, T
отделить любую часть в течение многих лет от любой части часа-минуты секунды.
Полтора часа есть PT1H30M
, Например.
Java.time
Классы Java.Time используют форматы ISO 8601 по умолчанию при анализе/генерации строк. Это включает в себя Period
а также Duration
Занятия для представления пролетов времени не прикреплены к временной шкале.
Duration d = Duration.ofHours( 1 ).plusMinutes( 30 );
String output = d.toString();
Идти в другом направлении, анализируя строку.
Duration d = Duration.parse( "PT1H30M" );
Видеть Живой код в iDeone.com.
Видеть Мой похожий ответ в Подобный вопрос.
О Java.time
А Java.time Рамки встроены в Java 8 и позже. Эти классы вытесняют неприятные старые наследие даты занятий, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
А Joda-Time Проект, теперь в Режим технического обслуживания, советует миграцию в Java.time классы
Чтобы узнать больше, увидеть Оракул Учебник. Анкет И поиск стека переполнены для многих примеров и объяснений. Спецификация JSR 310.
Где получить классы Java.Time?
- Java SE 8 а также SE 9 и позже
- Встроенный.
- Часть стандартного Java API с комплексной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 а также SE 7
- Большая часть функциональности Java.Time возвращается к Java 6 и 7 в Трит-Бэкпорт.
- Android
- А Threetenabp Проект адаптируется Трит-Бэкпорт (упомянуто выше) для Android конкретно.
- Видеть Как использовать ThreetEnabp….
А Третена-Экстра Проект расширяет Java.Time с дополнительными классами. Этот проект является проверкой для возможных будущих дополнений к Java.Time. Вы можете найти здесь полезные классы, такие как Interval
, YearWeek
, YearQuarter
, а также более.