Artigos
Java
Trabalhando com a Classe JFormattedTextField para aplicativos Desktop
Trabalhando com a Classe JFormattedTextField para aplicativos Desktop
A edição padrão de Java 2 (J2SE), versão 1.4, adiciona o componente JFormattedTextFieldcomo elementos disponíveis do GUI. Este artigo vem para ajudar a entender melhor e explorar um pouco mais o componente JFormattedTextField.
Quando o componente de JFormattedTextField olhar como JTextField, age completamente diferente. No caso o mais simples, você pode fornecer uma máscara da entrada como “(###) ###-####” para um número de telefone, e não aceitará nenhuma entrada que não seguir esse formato. Em uns casos mais complicados, há um formatador da exposição e um formatador da entrada. Por exemplo, as licenças do formatador da data do defeito que se enrolam com os meses ou os dias disponíveis baseados em onde o cursor é encontrado ao editar.
Ao trabalhar com JFormattedTextField, a entrada aceitável é especificada explicitamente pela máscara ou especificada por um valor para o componente. No último caso, o componente usa o teste padrão. O componente de DefaultFormatterFactory vem com os formatadores instalados por datas, números, java.text.
Como poderemos analisar no código abaixo, veremos que ao extender a classe JFormattedTextField podemos tratar Números, CPF, CNPJ, Alfanuméricos, Valores e assim por diante extendendo somente uma classe, fazendo assim nossos programas ficando mais enxuto.
Código de implementação: JFTextField.Java
1. import java.awt.Color;
2. import java.awt.Component;
3. import java.awt.Font;
4. import java.awt.event.FocusEvent;
5. import java.awt.event.FocusListener;
6. import java.awt.event.KeyEvent;
7. import java.awt.event.KeyListener;
8. import java.awt.Graphics;
9. import java.math.BigDecimal;
10. import java.text.ParseException;
11. import java.text.DecimalFormat;
12. import java.util.Locale;
13. import javax.swing.InputVerifier;
14. import javax.swing.JComponent;
15. import javax.swing.JFormattedTextField;
16. import javax.swing.JTextField;
17. import sac.utilitarios.Util;
18. public class JFTextField extends JFormattedTextField {
19. int line;
20. DecimalFormat formatador = new DecimalFormat();
21. protected char type = 'A';
22. protected MyFocusListener mflFocus = new MyFocusListener();
23. private KeyHandler khKey = new KeyHandler();
24. public JFTextField() {
25. line = 0;
26. initComponent();
27. }
28. public JFTextField(int l) {
29. line = l;
30. initComponent();
31. }
32. private void initComponent() {
33. formatador.applyPattern("R$ ###,##0.00;R$ (###,##0.00)");
34. setInputVerifier(new JTextVerifier());
35. setForeground(new Color( 0, 0, 0));
36. setBackground(null);
37. setBorder(null);
38. setDragEnabled(true);
39. setFocusLostBehavior(JFormattedTextField.COMMIT);
40. addFocusListener(mflFocus);
41. addKeyListener(khKey);
42. }
43. protected void paintComponent(Graphics g) {
44. super.paintComponent(g);
45. if (line != 0) {
46. g.setColor(new Color(197,194,185));
47. g.drawLine(0, line, getWidth(), line);
48. }
49. }
50. private class JTextVerifier extends InputVerifier {
51. public boolean verify(JComponent input) {
52. if (input instanceof JFormattedTextField) {
53. JFormattedTextField ftf = (JFormattedTextField)input;
54. AbstractFormatter formatter = ftf.getFormatter();
55. if (formatter != null) {
56. String text = ftf.getText();
57. try {
58. formatter.stringToValue(text);
59. return true;
60. } catch (ParseException pe) {
61. return false;
62. }
63. }
64. }
65. return true;
66. }
67. public boolean shouldYieldFocus(JComponent input) {
68. return verify(input);
69. }
70. }
71. public class MyFocusListener implements FocusListener {
72. public void focusGained(FocusEvent e) {
73. Component comp = e.getComponent();
74. if (comp != null) {
75. JFormattedTextField jt = (JFormattedTextField) comp;
76. jt.setBackground(new Color(184,207,229));
77. jt.selectAll();
78. }
79. }
80. public void focusLost(FocusEvent e) {
81. Component comp = e.getComponent();
82. if (comp != null) {
83. JFormattedTextField jt = (JFormattedTextField) comp;
84. jt.setBackground(null);
85. jt.selectAll();
86. switch (type) {
87. case 'V' : if (!jt.getText().equals("")) {
88. jt.setText(formatador.format(new BigDecimal(Util.converteStringtoValor(jt.getText()))));
89. } else jt.setText("");
90. break;
91. }
92 }
93. }
94. }
95. private class KeyHandler implements KeyListener {
96. public void keyTyped(KeyEvent e) {
97. switch (type) {
98. case 'F' : if (!((e.getKeyChar() >= '0') && (e.getKeyChar() <= '9') ||
99. (e.getKeyChar() == '-') ||
100. (e.getKeyChar() == '.') ||
101. (e.getKeyChar() == KeyEvent.VK_BACK_SPACE) ||
102. (e.getKeyChar() == KeyEvent.VK_DELETE))) {
103. getToolkit().beep();
104. e.consume();
105. }
106. break;
107. case 'J' : if (!((e.getKeyChar() >= '0') && (e.getKeyChar() <= '9') ||
108. (e.getKeyChar() == '-') ||
109. (e.getKeyChar() == '.') ||
110. (e.getKeyChar() == '/') ||
111. (e.getKeyChar() == KeyEvent.VK_BACK_SPACE) ||
112. (e.getKeyChar() == KeyEvent.VK_DELETE))) {
113. getToolkit().beep();
114. e.consume();
115. }
116. break;
117. case 'N' : if (!((e.getKeyChar() >= '0') && (e.getKeyChar() <= '9') ||
118. (e.getKeyChar() == KeyEvent.VK_BACK_SPACE) ||
119. (e.getKeyChar() == KeyEvent.VK_DELETE))) {
120. getToolkit().beep();
121. e.consume();
122. }
123. break;
124. case 'C' : if (!((e.getKeyChar() >= 'a') && (e.getKeyChar() <= 'z') ||
125. (e.getKeyChar() >= 'A') && (e.getKeyChar() <= 'Z') ||
126. (e.getKeyChar() == KeyEvent.VK_BACK_SPACE) ||
127. (e.getKeyChar() == KeyEvent.VK_DELETE))) {
128. getToolkit().beep();
129. e.consume();
130. }
131. break;
132. case 'A' : if (!((e.getKeyChar() >= 'a') && (e.getKeyChar() <= 'z') ||
133. (e.getKeyChar() >= 'A') && (e.getKeyChar() <= 'Z') ||
134. (e.getKeyChar() >= '0') && (e.getKeyChar() <= '9') ||
135. (e.getKeyChar() != KeyEvent.VK_BACK_SPACE) ||
136. (e.getKeyChar() != '.') || (e.getKeyChar() != '-') ||
137. (e.getKeyChar() != '{') || (e.getKeyChar() != '@') ||
138. (e.getKeyChar() != '=') || (e.getKeyChar() != '$') ||
139. (e.getKeyChar() != '%') || (e.getKeyChar() != '&') ||
140. (e.getKeyChar() != '*') || (e.getKeyChar() != '/') ||
141. (e.getKeyChar() != '\\')|| (e.getKeyChar() != ',') ||
142. (e.getKeyChar() != '?') || (e.getKeyChar() != ';') ||
143. (e.getKeyChar() != ':') || (e.getKeyChar() != '}') ||
144. (e.getKeyChar() != '[') || (e.getKeyChar() != ']') ||
145. (e.getKeyChar() != '(') || (e.getKeyChar() != ')') ||
146. (e.getKeyChar() != KeyEvent.VK_DELETE))) {
147. getToolkit().beep();
148. e.consume();
149. }
150. break;
151. case 'V' : if (!((e.getKeyChar() >= '0') && (e.getKeyChar() <= '9') ||
152. (e.getKeyChar() == KeyEvent.VK_COMMA) ||
153. (e.getKeyChar() == '.') ||
154. (e.getKeyChar() == KeyEvent.VK_BACK_SPACE) ||
155. (e.getKeyChar() == KeyEvent.VK_DELETE))) {
156. getToolkit().beep();
157. e.consume();
158. }
159. break;
160. }
161. }
162. public void keyPressed(KeyEvent e){
163. }
164. public void keyReleased(KeyEvent e){
165. }
166. }
167. public char setTyped(char stype) {
168. return (type = stype);
169. }
170. public void setCenterAlignment() {
171. setHorizontalAlignment(JTextField.CENTER);
172. }
173. public void setLeftAlignment() {
174. setHorizontalAlignment(JTextField.LEFT);
175. }
176. public void setRightAlignment() {
177. setHorizontalAlignment(JTextField.RIGHT);
178. }
179.}
Código de implementação: JFTextField.Java
1. public class Util {
2. public Util() {
3. }
4. public static String converteStringtoValor(String valor) {
5. String valorconvertido = "";
6. for (int i = 0; i < valor.length(); i++) {
7. if (valor.charAt(i) != 'R')
8. if (valor.charAt(i) != '$')
9. if (valor.charAt(i) != ' ')
10 if (valor.charAt(i) != '.') valorconvertido += valor.charAt(i);
11. }
12. return (valorconvertido.replace(',' , '.'));
13. }
14.}