Problemas com JFormattedTextField

1 resposta
JamesBond

Olá pessoal.

Estou com problemas no jformattedtextfield. Utilizei o MaskFormatter para limitar a entrada do textfield apenas para um caracter, e que seja apenas número. Na primeira vez, funciona. Mas depois que eu clico no botão LIMPAR, para apagar os números digitados, no textfield pode ser adicionado mais de um número, o que nao pode acontecer. Tem que ser inserido apenas um número.
Alguem tem alguma idéia ?
Segue o código abaixo.

public class Principal {
	JFrame frame;
	JPanel p, p_btn;
	JButton clear;
	JTextField t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13;
	
	public static void main(String args[]) {
		Principal main = new Principal();
		main.Componentes();
	}
	
	public void Componentes() {		
		
		MaskFormatter mask = new MaskFormatter();
		try {
			mask = new MaskFormatter("#");
		} catch(ParseException ex) { }
		
		frame = new JFrame();
		p = new JPanel();
		
		t1 = new JTextField("7");
		t1.setEditable(false);
		t2 = new JTextField("8");
		t2.setEditable(false);
		t3 = new JTextField("9");
		t3.setEditable(false);
		t4 = new JFormattedTextField(mask);
		t4.setPreferredSize(new Dimension(25, 10));
		t5 = new JFormattedTextField(mask);
		t5.setPreferredSize(new Dimension(25, 10));
		t6 = new JFormattedTextField(mask);
		t6.setPreferredSize(new Dimension(25, 10));
		t7 = new JFormattedTextField(mask);
		t7.setPreferredSize(new Dimension(25, 10));
		t8 = new JFormattedTextField(mask);
		t8.setPreferredSize(new Dimension(25, 10));
		t9 = new JFormattedTextField(mask);
		t9.setPreferredSize(new Dimension(25, 10));
		t10 = new JFormattedTextField(mask);
		t10.setPreferredSize(new Dimension(25, 10));
		t11 = new JFormattedTextField(mask);
		t11.setPreferredSize(new Dimension(25, 10));
		t12 = new JFormattedTextField(mask);
		t12.setPreferredSize(new Dimension(25, 10));
		t13 = new JFormattedTextField(mask);
		t13.setPreferredSize(new Dimension(25, 10));
		t13.setEditable(false);
		
		JPanel painelCentral = new JPanel(new BorderLayout());    // painel central -> container de todos os outros paineis
	    JPanel painelInferior = new JPanel(new FlowLayout());     // painel central -> container dos dois paineis inferiores
		
		TitledBorder titulo1;
		titulo1 = BorderFactory.createTitledBorder("ID produto");
		p.setBorder(titulo1);
		
		GridBagConstraints grid = new GridBagConstraints();
		GridBagLayout layout = new GridBagLayout();
		p.setLayout(layout);
		
		grid.fill = GridBagConstraints.BOTH;
		
		grid.gridy = 0;
		grid.gridx = 0;
		p.add(new JLabel("7 "), grid);
		
		grid.gridy = 0;
		grid.gridx = 1;
		p.add(new JLabel("8 "), grid);
		
		grid.gridy = 0;
		grid.gridx = 2;
		p.add(new JLabel("9 "), grid);
		
		grid.gridy = 0;
		grid.gridx = 3;
		p.add(new JLabel(". "), grid);
		
		grid.gridy = 0;
		grid.gridx = 4;
		p.add(t4, grid);
		
		grid.gridy = 0;
		grid.gridx = 5;
		p.add(t5, grid);
		
		grid.gridy = 0;
		grid.gridx = 6;
		p.add(t6, grid);
		
		grid.gridy = 0;
		grid.gridx = 7;
		p.add(t7, grid);
		
		grid.gridy = 0;
		grid.gridx = 8;
		p.add(t8, grid);
		
		grid.gridy = 0;
		grid.gridx = 9;
		p.add(t9, grid);
		
		grid.gridy = 0;
		grid.gridx = 10;
		p.add(t10, grid);
		
		grid.gridy = 0;
		grid.gridx = 11;
		p.add(t11, grid);
		
		grid.gridy = 0;
		grid.gridx = 12;
		p.add(t12, grid);
		
		grid.gridy = 0;
		grid.gridx = 13;
		p.add(new JLabel("-"), grid);
		
		grid.gridy = 0;
		grid.gridx = 14;
		p.add(t13, grid);
		
	    painelCentral.add(p,BorderLayout.CENTER);
	    
	    painelCentral.add(painelInferior,BorderLayout.SOUTH);
	    
	    clear = new JButton("Limpar");
	    p_btn = new JPanel();
	    p_btn.add(btn);
	    p_btn.add(clear);
	    painelInferior.add(p_btn);
	    
        clear.setToolTipText("Apagar todos os números digitados");
	    clear.addActionListener(
	    		new ActionListener() {
	    			public void actionPerformed(ActionEvent e) {
	    				t4.setText("");
	    				t5.setText("");
	    				t6.setText("");
	    				t7.setText("");
	    				t8.setText("");
	    				t9.setText("");
	    				t10.setText("");
	    				t11.setText("");
	    				t12.setText("");
	    				t13.setText("");
	    			}
	    		}
	    );
		
		frame.add(painelCentral);
		frame.setSize(400, 150);
		frame.setVisible(true);
		frame.setResizable(false);
	}
}

1 Resposta

javer

Meu caro, ao invés de JTextField você deve usar o JFormattedTextField e aplicar um formato nele e use a propriedade value do campo e não text, segue um exemplo:

public static DefaultFormatterFactory setFormatoLivre(String mask) {
	MaskFormatter comFoco = null, withoutFocus = null;
	try {
		comFoco = new MaskFormatter(mask);
	} catch (Exception pe) {
	}
	DefaultFormatterFactory factory = new DefaultFormatterFactory(comFoco, comFoco);
	return factory;
}

JFormattedTextField campo = new JFormattedTextField();

campo.setFormatterFactory(setFormatoLivre("#"));

campo.setValue( 10 ); // ou .setValue( new Integer(10) )

int valorCampo = (Integer)campo.getValue();
Criado 17 de janeiro de 2009
Ultima resposta 18 de jan. de 2009
Respostas 1
Participantes 2