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