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.}