Passar o focus para um JTextField

5 respostas
R

Dae pessoal!

Estou fazendo uma applet simples para o usuário digitar valores em vários JTextField.
Cada um dos valores que o usuário colocar devem ser verificados assim que ele terminar de colocá-lo. Pra resolver isso resolvi o usar um FocusListener, sempre que um JTextField perdesse o focus eu poderia validar o que foi digitado. Até aí não tive problema.

O problema apareceu quando o usuário coloca um valor errado. Coloquei um JOptionPane para avisar o usuário que o valor digitado está incorreto, então utilizo um requestFocus() mas não consigo passar o focus para o JTextField que teve problema assim que dou “OK” no JOptionPane…

O que eu fiz funciona, mas muuiito mal! :evil:
Ao invez do JOptionPane aparecer uma única vez ele aparece 4!

Alguém aí tem uma idéia de como arrumar isso?? Ou fazer isso de uma outra maneira??

O código tá aí embaixo, se alguem puder me ajudar eu agradeço, e muito! :cool:

pro erro aparecer é só digitar 1000 (ou algo maior do que 300) no primeiro JTextField (Fill Time (s)) e depois clicar em outro JTextField… o código que trata o evento tá em “validateInputText”

desde já agradeço :lol:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class TimeProfilesJPanel extends TimeProfilesJPanel_view {
	private int[] m_fillTimeLimits = {0, 300};
	private String m_fillTimeUnit = "s";
	
	private int[] m_holdingTimeLimits = {0, 600};
	private String m_holdingTimeUnit = "s";
	
	private int[] m_coolingTimeLimits = {0, 600};
	private String m_coolingTimeUnit = "s";
	
	private int[] m_moldOpenTimeLimits = {0, 600};
	private String m_moldOpenTimeUnit = "s";
	
	private int[] m_cycleTimeLimits = {0, 600};
	private String m_cycleTimeUnit = "s";
	
	public TimeProfilesJPanel(){
		this.init();
	}
	
	public void init(){
		this.initListeners();
	}
	
	public void initComboBox(){
		
	}
	
	public void initListeners(){
		TimeProfileJPanel_JTextField_focusAdapter jTextFieldListener = new TimeProfileJPanel_JTextField_focusAdapter(this);
		
		this.m_fillTimeTextField.addFocusListener(jTextFieldListener);
		this.m_holdingTimeTextField.addFocusListener(jTextFieldListener);
		this.m_coolingTimeTextField.addFocusListener(jTextFieldListener);
		this.m_moldOpenTimeTextField.addFocusListener(jTextFieldListener);
		this.m_cycleTimeTextField.addFocusListener(jTextFieldListener);
	}
	
	public void validateInputText(FocusEvent fe){
		Object source = fe.getSource();
		int value;
		
		if(source.equals(this.m_fillTimeTextField)){
			String inputText = this.m_fillTimeTextField.getText();
			
			if(!inputText.equals("")){
				try{
					value = Integer.parseInt(this.m_fillTimeTextField.getText());
					
					if(!(value >= this.m_fillTimeLimits[0] && value <= this.m_fillTimeLimits[1])){
						JOptionPane.showMessageDialog(null, "sdfsdfsdfs");
						this.m_fillTimeTextField.requestFocus();
					}
				}
				catch(Exception e){
					e.printStackTrace();
				}
			}
			
		}
		else if(source.equals(this.m_holdingTimeTextField)){
			
		}
		else if(source.equals(this.m_coolingTimeTextField)){
			
		}
		else if(source.equals(this.m_moldOpenTimeTextField)){
			
		}
		else if(source.equals(this.m_cycleTimeTextField)){
			
		}
		else{
			//erro
		}
	}
	
	public static void main(String[] args){
		JFrame f = new JFrame("teste");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		f.getContentPane().add(new TimeProfilesJPanel());
		f.pack();
		f.setVisible(true);
	}
}

class TimeProfileJPanel_JTextField_focusAdapter implements FocusListener{
	private TimeProfilesJPanel adaptee;	
	
	public TimeProfileJPanel_JTextField_focusAdapter(TimeProfilesJPanel adaptee){
		this.adaptee = adaptee;
	}
	
	public void focusLost(FocusEvent fe){
		//System.out.println("Perdeu o focus");
		this.adaptee.validateInputText(fe);
	}
	public void focusGained(FocusEvent fe){
		//System.out.println("Ganhou o focus");
	}
}

outra parte…

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class TimeProfilesJPanel_view extends JPanel {
	public TimeProfilesJPanel_view() {
		initComponents();
	}

	private void initComponents() {
		label1 = new JLabel();
		label2 = new JLabel();
		m_fillTimeTextField = new JTextField();
		label3 = new JLabel();
		m_holdingTimeTextField = new JTextField();
		label4 = new JLabel();
		m_coolingTimeTextField = new JTextField();
		label5 = new JLabel();
		m_moldOpenTimeTextField = new JTextField();
		label6 = new JLabel();
		label7 = new JLabel();
		m_cycleTimeTextField = new JTextField();

		setBorder(new EmptyBorder(5, 5, 5, 5));

		setLayout(new GridBagLayout());
		((GridBagLayout)getLayout()).columnWidths = new int[] {20, 0, 100, 0};
		((GridBagLayout)getLayout()).rowHeights = new int[] {0, 0, 0, 0, 0, 20, 0, 0, 0};
		((GridBagLayout)getLayout()).columnWeights = new double[] {0.0, 0.0, 0.0, 1.0E-4};
		((GridBagLayout)getLayout()).rowWeights = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0E-4};

		label1.setText("Machine variables (indenpendently controllable)");
		label1.setFont(new Font("Tahoma", Font.BOLD, 11));
		label1.setForeground(Color.red);
		add(label1, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 5, 5), 0, 0));

		label2.setText("Fill time (s)");
		add(label2, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 5, 5), 0, 0));
		add(m_fillTimeTextField, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 5, 0), 0, 0));

		label3.setText("Holding time (s)");
		add(label3, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 5, 5), 0, 0));
		add(m_holdingTimeTextField, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 5, 0), 0, 0));

		label4.setText("Cooling time (s)");
		add(label4, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 5, 5), 0, 0));
		add(m_coolingTimeTextField, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 5, 0), 0, 0));

		label5.setText("Mold-open time (s)");
		add(label5, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 5, 5), 0, 0));
		add(m_moldOpenTimeTextField, new GridBagConstraints(2, 4, 1, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 5, 0), 0, 0));

		label6.setText("Process variables (dependent)");
		label6.setFont(new Font("Tahoma", Font.BOLD, 11));
		label6.setForeground(Color.red);
		add(label6, new GridBagConstraints(0, 6, 2, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 5, 5), 0, 0));

		label7.setText("Cycle time (s)");
		add(label7, new GridBagConstraints(1, 7, 1, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 0, 5), 0, 0));
		add(m_cycleTimeTextField, new GridBagConstraints(2, 7, 1, 1, 0.0, 0.0,
			GridBagConstraints.CENTER, GridBagConstraints.BOTH,
			new Insets(0, 0, 0, 0), 0, 0));
	}

	protected JLabel label1;
	protected JLabel label2;
	protected JTextField m_fillTimeTextField;
	protected JLabel label3;
	protected JTextField m_holdingTimeTextField;
	protected JLabel label4;
	protected JTextField m_coolingTimeTextField;
	protected JLabel label5;
	protected JTextField m_moldOpenTimeTextField;
	protected JLabel label6;
	protected JLabel label7;
	protected JTextField m_cycleTimeTextField;
	
}

5 Respostas

C

Sobre o focus… use…

seuJTextField.requestFocus(true);

OK ?

R

opa!

valew pela dica, mas não funcionou…
o JOptionPane ainda aparece 4 vezes depois usar o requestFocus no jtextfield

alguem aí tem alguma outra idéia?!

valews!!

C

Debug…
pra saber ond estao sendo enviados esses 4 JOP

william_sistema

Cara vc conseguiu resolver este porblema?

estou com o mesmo problema que vc…

teria como postar a solução por favor…

agradeço a atenção.

A

O que o companheiro CassolatoPJ disse não está errado caso a intenção seja colocar em Focus o seu jTextField simples.
Eu fiz aqui, e no caso apenas ficaria assim:

[color=green]jTextField1[/color].requestFocus(); //usei como exemplo o padrão jTextField1

É só apenas retirar o “true” dos parênteses.

Criado 9 de novembro de 2006
Ultima resposta 28 de out. de 2010
Respostas 5
Participantes 4