Я искал различные способы форматирования JFormattedTextField для создания пользовательской записи.
Мне нужно отображение, чтобы использовать двоеточие в качестве разделителя, например в поле времени в форме 12:34:56
,Очевидно, что это можно легко сделать с помощью пользовательского maskFormatter, который будет содержать начальное значение 00:00:00
, пока пользователь не начнет вводить данные.
Это работает относительно хорошо, но мне нужно, чтобы запись работала справа налево (по аналогии с калькулятором: ввод цифр, начиная справа, и ввод слева при вводе. Опять работает DateFormatter, и янапример, функция, позволяющая использовать стрелки вверх / вниз при выборе, чтобы увеличивать / уменьшать время для каждого из полей, но опять-таки это не позволяет вводить время, например 00:00:90
, подобное тому, как в микроволновой печиТаймер не работает и не имеет функции перезаписи (или, по крайней мере, не то, что я вижу).
Я видел несколько примеров использования числителя и фильтров документов здесь, на SO, но опять-таки они не соответствуют моим требованиям.
Вот базовый класс, который показывает все 3 примера в простейшей форме.
Я ищу комбинацию SimpleMaskFormatter и SimpleDateFormat (больше склоняясь к SimpleDateFormat сфункция перезаписи). Я думал, что мне нужно написать собственный фильтр документов для датыформат, но думал, что я выложу это, чтобы увидеть, есть ли у кого-нибудь предложения о том, как это решить?
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.MaskFormatter;
import net.miginfocom.swing.MigLayout;
public class FormattedTextInput extends JFrame {
private FormattedTextInput() {
setLayout(new MigLayout());
JFormattedTextField textField1 = new JFormattedTextField(new SimpleMaskFormatter());
textField1.setColumns(10);
textField1.setHorizontalAlignment(JTextField.RIGHT);
add(textField1, "wrap");
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
JFormattedTextField textField2 = new JFormattedTextField(dateFormat);
textField2.setColumns(10);
textField2.setHorizontalAlignment(JTextField.RIGHT);
textField2.setText("00:00:00");
add(textField2, "wrap");
DecimalFormatSymbols colonSeporator = new DecimalFormatSymbols();
colonSeporator.setGroupingSeparator(':');
DecimalFormat decimalFormat = new DecimalFormat("00:00:00", colonSeporator);
decimalFormat.setGroupingUsed(true);
decimalFormat.setMaximumIntegerDigits(6);
decimalFormat.setGroupingSize(2);
JFormattedTextField textField3 = new JFormattedTextField(decimalFormat);
textField3.setHorizontalAlignment(JTextField.TRAILING);
textField3.setColumns(10);
add(textField3, "wrap");
}
private class SimpleMaskFormatter extends MaskFormatter {
SimpleMaskFormatter() {
try {
setMask("##:##:##");
} catch (ParseException e) {
e.printStackTrace();
}
setPlaceholderCharacter('0');
setCommitsOnValidEdit(true);
}
}
public static void main(String[] args) {
FormattedTextInput window = new FormattedTextInput();
window.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
}
}