JFormattedTextField问题

在此处输入图像描述在此处输入图像描述

1)如何将Cursor设置为0,而不使用Caret或Focus包装到invokeLater()(使用@camickr 格式化文本字段提示可以解决),是否有人知道另一种方式

在此处输入图像描述在此处输入图像描述

2) How to reset Formatter有时How to reset Formatter (通过TAB从键盘提升Focus),重置不起作用,并且在focusLost(空字段)格式化程序返回/重新生成的字符或字符串返回(最后知道在setText(“”)之前;),

注意:知道代码或下面的代码is only this way ,关于如何从OTN重置Formatter,但他们可怕的搜索规则….,只有代码(问题或答案由Jeanette ???)

 import java.awt.event.*; import java.beans.*; import java.text.ParseException; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.Document; public class FormattedNull { private JFormattedTextField field; private JButton focusButton; private JComponent createContent() { JComponent content = new JPanel(); field = new JFormattedTextField(new Integer(55)); field.setColumns(20); field.addPropertyChangeListener(getPropertyChangeListener()); field.getDocument().addDocumentListener(getDocumentListener()); content.add(field); focusButton = new JButton("just something focusable"); focusButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { field.setValue(0); field.requestFocusInWindow(); } }); content.add(focusButton); return content; } protected void maybeCommitEdit(Document document) { try { field.commitEdit(); } catch (ParseException e) { // uncomment to map empty string to null if (field.getText().length() == 0) { field.setValue(null); } } } /*public void commitEdit() throws ParseException { if(allowsNull() && isBlank()) { setValue(null); } else { super.commitEdit(); } }*/ private PropertyChangeListener getPropertyChangeListener() { PropertyChangeListener propertyChangeListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ("value".equals(evt.getPropertyName())) { matchValueChanged(evt.getNewValue()); } } }; return propertyChangeListener; } protected void matchValueChanged(Object value) { System.out.println("got new value: " + value); } private DocumentListener getDocumentListener() { DocumentListener documentListener = new DocumentListener() { @Override public void removeUpdate(DocumentEvent e) { maybeCommitEdit(e.getDocument()); } @Override public void insertUpdate(DocumentEvent e) { maybeCommitEdit(e.getDocument()); } @Override public void changedUpdate(DocumentEvent e) { } }; return documentListener; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame(""); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new FormattedNull().createContent()); frame.setLocationRelativeTo(null); frame.pack(); frame.setVisible(true); } }); } } 

在此处输入图像描述

附加图像基于我的sscce

 import java.awt.GridLayout; import java.awt.event.ActionEvent; import javax.swing.*; import javax.swing.text.MaskFormatter; public class TestTest { private JFormattedTextField myFormattedField1 = new JFormattedTextField(createFormatter("AAAAAAAAAAAA")); private JFormattedTextField myFormattedField2 = new JFormattedTextField(createFormatter("AAAAAAAAAAAA")); private JFormattedTextField myFormattedField3 = new JFormattedTextField(createFormatter("AAAAAAAAAAAA")); private JFormattedTextField myFormattedField4 = new JFormattedTextField(createFormatter("AAAAAAAAAAAA")); private JButton jb = new JButton("Reset to Default"); private JFrame frame = new JFrame("Text Test"); public TestTest() { myFormattedField1.setText("ABCDEFGHIJKL"); myFormattedField2.setText("ABCDEFGHIJKL"); myFormattedField3.setText("ABCDEFGHIJKL"); myFormattedField4.setText("ABCDEFGHIJKL"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocation(150, 150); frame.setLayout(new GridLayout(5, 0)); frame.add(jb); frame.add(myFormattedField1); frame.add(myFormattedField2); frame.add(myFormattedField3); frame.add(myFormattedField4); jb.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent e) { myFormattedField1.setText(""); myFormattedField2.setText(""); myFormattedField3.setText(""); myFormattedField4.setText(""); } }); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { TestTest textTest = new TestTest(); } protected MaskFormatter createFormatter(String s) { MaskFormatter formatter = null; try { formatter = new MaskFormatter(s); } catch (java.text.ParseException exc) { System.err.println("formatter is bad: " + exc.getMessage()); } return formatter; } } 

  1. 在Mac OS上,UI委托的默认行为com.apple.laf.AquaTextFieldFCaretPositionListener类似:

    • TabShiftTab :将插入符号放在字段的开头。

    • 单击:将插入符号短暂放置在字段的开头,然后将其移动到单击点。

    IMO, CaretPositionListener使后者更加顺畅。

  2. JFormattedTextField在焦点丢失时的默认行为是COMMIT_OR_REVERT 。 在下面的示例中, Tab虽然是第一个,但是无效字段可以看到效果。 格式化程序既不能提交也不能恢复为无效值,因此它可以替换MASK.length()空格。 如果有点模糊,这个值是有效的。

附录:我已更新下面的代码以允许更改setFocusLostBehavior()

码:

 import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.text.MaskFormatter; /** @see http://stackoverflow.com/questions/7378821 */ public class TrashTest { private static final String MASK = "########"; private static final String DEFAULT = "01234567"; private static final String BOGUS = "0123456"; private JFormattedTextField jtf1 = createField(); private JFormattedTextField jtf2 = createField(); private JFormattedTextField jtf3 = createField(); private JFormattedTextField jtf4 = createField(); private JButton reset = new JButton("Reset to Default"); private JComboBox combo = new JComboBox(); private JFrame frame = new JFrame("Text Test"); public TrashTest() { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocation(150, 150); frame.setLayout(new GridLayout(0, 1)); frame.add(reset); frame.add(jtf1); frame.add(jtf2); frame.add(jtf3); frame.add(jtf4); frame.add(combo); this.initFields(); reset.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { initFields(); } }); for (Edit e : Edit.values()) { combo.addItem(e); } combo.setSelectedIndex(jtf1.getFocusLostBehavior()); combo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Edit current = (Edit) combo.getSelectedItem(); jtf1.setFocusLostBehavior(current.value); } }); frame.pack(); frame.setVisible(true); } private void initFields() { jtf1.setText(BOGUS); jtf2.setText(DEFAULT); jtf3.setText(DEFAULT); jtf4.setText(DEFAULT); } protected JFormattedTextField createField() { MaskFormatter formatter = null; try { formatter = new MaskFormatter(MASK); } catch (java.text.ParseException e) { e.printStackTrace(System.out); } JFormattedTextField jtf = new JFormattedTextField(formatter); return jtf; } enum Edit { COMMIT(JFormattedTextField.COMMIT), COMMIT_OR_REVERT(JFormattedTextField.COMMIT_OR_REVERT), REVERT(JFormattedTextField.REVERT), PERSIST(JFormattedTextField.PERSIST); private int value; private Edit(int n) { this.value = n; } public static Edit getEnum(int n) { for (Edit e : Edit.values()) { if (e.value == n) { return e; } } return Edit.COMMIT_OR_REVERT; } } public static void main(String[] args) { TrashTest textTest = new TrashTest(); } }