修改MaskFormatter以允许从右向左输入

时间:2018-11-23 14:20:35

标签: java jformattedtextfield

我一直在研究格式化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);
  }
}

0 个答案:

没有答案