Изменение MaskFormatter для разрешения ввода справа налево - PullRequest
0 голосов
/ 23 ноября 2018

Я искал различные способы форматирования 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);
  }
}
...