Enter p/ proximo campo e mais algumas coisas, generalizando

8 respostas
anjomal

Ae galera blza !! a classe que eu vou mostrar a seguir e parte do framework swingdata no qual estou desenvolvendo e ja devo ter uma versão essa semana, atrasou :roll: , mas vamos lá, para o pessoal que quer ter efeito de ENTER p/ proximo campo e tambem efeitos de seleção de texto ao dar foco e mudança de cor dos componentes de texto ao receber foco faça o seguite:

Crie uma interface vazia com o seguinte conteudo:

/*
 * Created on 07/07/2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
//package com.swingdata; Coloque o package de sua preferencia

/**
 * @author William J. Oliveira
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public interface ModelDataComponet {

}

depois crie a classe a seguir:

/*
 * Created on 14/07/2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
//package com.swingdata.extras; coloque o package que achar melhor

import java.awt.Color;
import java.awt.Component;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.swing.JComboBox;
import javax.swing.JTextField;

import com.swingdata.ModelDataComponet;

/**
 * @author William J. Oliveira
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class ComponentEnter implements KeyListener, FocusListener {
	private ModelDataComponet form;
	private Color background;
	private Color temp_background;
	private boolean focuscolor = false;
	private boolean focusselect = false;

	public ComponentEnter(ModelDataComponet form) {
		this(form, false,false, null);
	}

	public ComponentEnter(ModelDataComponet form, boolean b1,boolean b2, Color c) {
		this.background = c;
		this.focuscolor = b1;
		this.focusselect = b2;
		this.form = form;
		initAll();
	}

	/**
	 * 
	 */
	private void initAll() {
		Class c = form.getClass();
		Method[] m = c.getDeclaredMethods();
		for (int i = 0; i < m.length; ++i) {

			try {

				if (m[i].getName().indexOf("get") != -1) {

					System.out.println(m[i].getName());
					Object ret = m[i].invoke(form, null);

					if (ret instanceof Component)
						 ((Component) ret).addKeyListener(this);

					if (ret instanceof JTextField)
						 ((JTextField) ret).addFocusListener(this);

					if (ret instanceof JComboBox)
						 ((JComboBox) ret).addFocusListener(this);

				}

			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_ENTER) {
			// Pega o componente de onde veio o evento
			Component c = e.getComponent();

			// transfere o foco para o proximo componente 
			c.transferFocus();
			c = null;
		}
	}

	public void keyTyped(KeyEvent e) {
	}
	public void keyReleased(KeyEvent e) {
	}

	/* (non-Javadoc)
	 * @see java.awt.event.FocusListener#focusGained(java.awt.event.FocusEvent)
	 */
	public void focusGained(FocusEvent e) {
		if (focuscolor) {
			// Pega o componente de onde veio o evento
			Component c = e.getComponent();

			if (focusselect) {
				if (c instanceof JTextField)
					 ((JTextField) c).selectAll();
			}
			// transfere o foco para o proximo componente
			temp_background = c.getBackground();
			c.setBackground(background);
			c = null;

		}
	}

	public void focusLost(FocusEvent e) {
		if (focuscolor)
			e.getComponent().setBackground(temp_background);
	}
	/**
	 * @return
	 */
	public Color getBackground() {
		return background;
	}

	/**
	 * @return
	 */
	public boolean isFocuscolor() {
		return focuscolor;
	}

	/**
	 * @param color
	 */
	public void setBackground(Color color) {
		background = color;
	}

	/**
	 * @param b
	 */
	public void setFocuscolor(boolean b) {
		focuscolor = b;
	}

	/**
	 * @return
	 */
	public boolean isFocusselect() {
		return focusselect;
	}

	/**
	 * @param b
	 */
	public void setFocusselect(boolean b) {
		focusselect = b;
	}

}

depois no cosntrutor de sua classe JForm, JPanel e etc coloque o seguinte codigo:

ComponentEnter enter = new ComponentEnter(this,true,true,Color.YELLOW);

Lembrando que o Componente usa reflection de modo que vc tem de beanficar sua Classe, ou seja criar gets para os components que vc desejar implementar essas funções tipo:

private JTextField text = new JTextField();

public JTextField getText(){
 return text;
}

bom por enqaunto e isso ai, isso e parte dos componentes extras do pacote swingdata, to desenvolendo outros como caixas de texto com calendario e etc … p/ facilitar o desenvolvimento desktop, quem quiser mais infos sobre o projeto comunica-me :smiley: vou ver se essa semana termino pois perdi um tempão essa semana padronizando o codigo

valew!!!
t+

8 Respostas

Ironlynx

Ótimo componente anjomal,mas me ocorre um erro chato…qdo chega a um JList,trava…(não consegue pulá-lo…)engraçado q eu ainda não consegui fazer isso…m… :?

anjomal

Ta faltando isso aqui no codigo da classe ComponentEnter:

if (ret instanceof JList) 
                   ((JList) ret).addFocusListener

coloque logo abaixo daqui:

if (ret instanceof JComboBox) 
                   ((JComboBox) ret).addFocusListener

ai funciona e pq eu não tinha me atentado ao component List e pq na aplicação de exemplo que to fazendo a API eu tinha me esquecido :oops: mas ta resolvido :wink:

valew

Ironlynx

Pow isso…eu tinha feito anjo…huahauh… :lol:
Mas devo ter descoberto o erro…(nome errado em um dos comps…)
Peraí q eu vou testar aqui…huaha

anjomal

Pow Ironlynx foi mal :oops: mas eu tambem errei, pq eu testo se o Objeto e um Component então qualquer component recebera o keylistner a questão do codigo que eu coloquei acima e mesmo para fazer o efeito de mudança de cor tambem no JLIST falow :smiley:

t+

Ironlynx

Ih…sem essa anjomal!huaha… eu tb tô tomando um puta “caldo” do swing…
Naum adianta…no JList,ele não transfere o Foco de Modo nenhum… depois q chega no final da lista de opções(umas 5 por exemplo),o foco fica inútil e não eh transferido para o textfield seguinte… :cry:

Ironlynx
PO-HA!!!É um bug do swing(bug #4866958)

depois de vc adicionar o ouvinte de foco na sua JList:

list.addFocusListener(this); e adicionar um scroll a ela:

JScrollPane listScrollPane = new JScrollPane(list);

Vc tem q fazer:

 listScrollPane.getVerticalScrollBar().setFocusable(false);

listScrollPane.getHorizontalScrollBar().setFocusable(false);



Senão nenhum componente irá trabalhar com o foco depois

Ufa! <img src="//https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/s.pngmiley.png?v=5" title=":smiley:" class="emoji" alt=":smiley:">

Menos um
anjomal

KRAMBA !!! :shock:

Essa foi de matar !!! e eu que descobri um bug na Classe Exception :? mas to superando, engraçado de naum ter dado esse bug comigo pq eu não adicionei um JScrollPane ao meu objeto JList, coisas de aplicação de teste :lol: mas agora ta funcionando tudo blzinha.

Ae Ironlynx não quer ajudar no projeto não :wink:
:smiley:

falow

Ironlynx

Tô bem atarefado ralando com projeto final e uma aplicação para entregar(essa mardita q tah me dando trabalho…),mas tamos aí! :smiley:
Me contate via ICQ.

Criado 15 de julho de 2004
Ultima resposta 15 de jul. de 2004
Respostas 8
Participantes 2