Teclado Virtual [RESOLVIDO]

21 respostas
pedroroxd

Pessoal, um cara aki do guj perguntou pra mim como faz um teclado virtual...

Eu fiz um aki rapidinho, assim (executem ae para ver):
public class TecladoVirtual extends JFrame {

	private static final long serialVersionUID = 1L;
	private JLabel jLabelNome;
	private JLabel jLabelSenha;
	private JTextField jTextNome;
	private JTextField jTextSenha;
	private JPanel _jPanelBotoes;
	private JButton btnA;
	private JButton btnB;
	private JButton btnC;
	private JButton btnD;
	private JButton btnBackspace;

	public TecladoVirtual() {
		setTitle("Teclado Virtual");
		setLayout(new MigLayout());
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setResizable(false);

		// ////////
		instanciarcomponentes();
		// ////////
		setdisable();
		add(jLabelNome);
		add(jTextNome, "span");
		add(jLabelSenha);
		add(jTextSenha, "span");
		add(btnBackspace, "gaptop20, grow, span");
		add(_jPanelBotoes, "span");
		// //////
		pack();
		setLocationRelativeTo(null);

	}

	private void setdisable() {
		btnA.setFocusable(false);
		btnB.setFocusable(false);
		btnC.setFocusable(false);
		btnD.setFocusable(false);
		btnBackspace.setFocusable(false);
	}

	private void instanciarcomponentes() {

		jLabelNome = new JLabel("Digite o nome: ");
		jLabelSenha = new JLabel("Digite a senha: ");
		jTextNome = new JTextField(12);
		jTextSenha = new JTextField(12);

		btnA = new JButton("A");
		btnA.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				escreveletra("A");
			}
		});

		btnB = new JButton("B");
		btnB.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				escreveletra("B");
			}
		});

		btnC = new JButton("C");
		btnC.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				escreveletra("C");
			}
		});

		btnD = new JButton("D");
		btnD.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				escreveletra("D");
			}
		});

		btnBackspace = new JButton("Apagar");
		btnBackspace.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (jTextNome.hasFocus()) {
					String m = jTextNome.getText();

					if (m.length() > 0) {
						m = m.substring(0, (m.length()) - 1);
						jTextNome.setText(m);
						jTextNome.requestFocus(true);
					}
				}

				else {
					String m = jTextSenha.getText();

					if (m.length() > 0) {
						m = m.substring(0, (m.length()) - 1);
						jTextSenha.setText(m);
						jTextSenha.requestFocus(true);
					}
				}
			}
		});

		_jPanelBotoes = new JPanel();
		_jPanelBotoes.setBorder(new TitledBorder(null, "Botões",
				TitledBorder.DEFAULT_JUSTIFICATION,
				TitledBorder.DEFAULT_POSITION, null, new Color(49, 106, 196)));
		_jPanelBotoes.setLayout(new MigLayout());
		_jPanelBotoes.add(btnA);
		_jPanelBotoes.add(btnB);
		_jPanelBotoes.add(btnC);
		_jPanelBotoes.add(btnD);
	}

	private void escreveletra(String letra) {
		if (jTextNome.hasFocus()) {
			String m = jTextNome.getText();
			jTextNome.setText(m + letra);
			jTextNome.requestFocus(true);
		}

		else {
			String m = jTextSenha.getText();
			jTextSenha.setText(m + letra);
			jTextSenha.requestFocus(true);
		}
	}

	public static void main(String[] args) {
		new TecladoVirtual().setVisible(true);
	}

}

Seria assim a realmente a melhor maneira de fazer?
Agradeço.

21 Respostas

Adelar

Não pude executar o código, mas uma coisa que você pode fazer também é sortear a ordem dos botões na tela. :slight_smile:

pedroroxd

Não é nisso que está o problema… Eu quero saber se esse é o melhor geito de realizar ele, ou não precisa ficar tirando o Focusable, e colocando ActionListener iguais em todos…

Adelar

A minha opinião é que não há problema em resolver o problema do foco desta forma. :slight_smile:

lina

wellington.nogueira:
A solução em si não é ruim, mas mudaria um pouco a implementação de modo a manter certos pontos agrupados (como as implementações dos listeners e os setFocusable dos botões.

Ex.: Colocaria todos os botões num List e usaria um for que passaria por todos. Assim, se precisasse adicionar um botão novo, não teria q declarar o mesmo como setFocusable(false). O mesmo seria feito com os listeners (vc pode obter, dentro do listener, qual letra a ser digitada).

Oi,

Além da utilização acima, utilizaria MouseListener para todos os botões. E não um actionListener para todos os botões em especifico.

O Grande lance de fazer um teclado virtual é ter o foco da janela presente no momento pelo S.O.

Ou seja, saber que um Notepad está aberto e escrever dentro dele.

Tchauzin!

pedroroxd

Alguém pode fazer um pequeno exemplo usando essas sugestões?
Agredeço.

lina

pedroroxd:
Alguém pode fazer um pequeno exemplo usando essas sugestões?
Agredeço.

Oi,

Olha… da para fazer algo do tipo:

String[] 
is_key_name =	
{
     "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=",
     "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "[", "]",
     "A", "S", "D", "F", "G", "H", "J", "K", "L", ";", "'",
     "Z", "X", "C", "V", "B", "N", "M", ",", ".", "/"
};

JButton[] io_bt_keyboard = new JButton[is_key_name.length];


// Cria os botões: "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "="
for (int ln = 0; ln <= 11; ln++) {

     io_bt_keyboard[ln] = new JButton(null);
     io_bt_keyboard[ln].setText(is_key_name[ln]);
     add(io_bt_keyboard[ln]); // Utilize layout para posicionalos na primeira linha..
}

// Cria a ação para os botões.
for (int i = 0; i < is_key_name.length; i++) {

     io_bt_keyboard[i].addActionListener
     (
          new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                    System.out.println(e.getActionCommand());
               }
          }
     );
}

Tchauzin!

pedroroxd
Valeu lina! Dei 1 enxugada no código, e fiz a GUI.. Ficou assim:
public class TecladoVirtual extends JFrame {

	private static final long serialVersionUID = 1L;
	private JLabel jLabelNome;
	private JLabel jLabelSenha;
	private JTextField jTextNome;
	private JTextField jTextSenha;
	private JPanel _jPanelBotoes;

	public TecladoVirtual() {

		setTitle("Teclado Virtual");
		setLayout(new MigLayout());
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setResizable(false);
		// ////
		instanciarcomponentes();
		// /////
		add(jLabelNome);
		add(jTextNome, "span");
		add(jLabelSenha);
		add(jTextSenha, "span");
		add(_jPanelBotoes, "gaptop20, span");
		// ////
		pack();
		setLocationRelativeTo(null);
	}

	private void instanciarcomponentes() {
		jLabelNome = new JLabel("Digite o nome: ");
		jLabelSenha = new JLabel("Digite a senha: ");
		jTextNome = new JTextField(12);
		jTextSenha = new JTextField(12);
		_jPanelBotoes = new JPanel();
		_jPanelBotoes.setBorder(new TitledBorder(null, "Botões",
				TitledBorder.DEFAULT_JUSTIFICATION,
				TitledBorder.DEFAULT_POSITION, null, new Color(49, 106, 196)));
		_jPanelBotoes.setLayout(new MigLayout());

		String[] caracteres = { "1", "2", "3", "4", "5", "6", "7", "8", "9",
				"0", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
				"L", "M", "N", "O", "P", "Q", "T", "S", "T", "U", "V", "W",
				"X", "Y", "Z", "BACKSPACE" };

		JButton[] vetordebotoes = new JButton[caracteres.length];

		// Cria os botões
		for (int cont = 0; cont < caracteres.length; cont++) {
			int i = cont + 1; //i é 1 variável que nunca pode ser 0

			vetordebotoes[cont] = new JButton(caracteres[cont]);

			if (i % 10 == 0) { //se multiplo de 10, adiciona e quebra a linha
				_jPanelBotoes.add(vetordebotoes[cont], "span");
			} else if (cont == caracteres.length - 1) { //o ultimo (backspace ocupa a linha inteira)
				_jPanelBotoes.add(vetordebotoes[cont], "grow, span");
			} else { // senão só adiciona
				_jPanelBotoes.add(vetordebotoes[cont]);
			}
			vetordebotoes[cont].setFocusable(false);// não deixa focusable

			vetordebotoes[cont].addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					escreveouapaga(e);
				}
			});
		}
	}

	private void escreveouapaga(ActionEvent e) {
		//pega qual tem focus e grava no JTextField qual
		JTextField qual;
		if (jTextNome.hasFocus()) {
			qual = jTextNome;
		} else {
			qual = jTextSenha;
		}
		String oqtaescrito = qual.getText();

		if (e.getActionCommand().equals("BACKSPACE")) {
			if (oqtaescrito.length() > 0) {
				oqtaescrito = oqtaescrito.substring(0, (oqtaescrito.length()) - 1);		
			}
		}
		
		else {
			oqtaescrito = oqtaescrito + e.getActionCommand();
		}
		qual.setText(oqtaescrito);
	}

	public static void main(String[] args) {
		new TecladoVirtual().setVisible(true);
	}
}
lina

Oi,

Então… visivelmente parece estar melhor.

O que você achou? melhorou ou piorou? (isso é importante)

Tchauzin!

pedroroxd

Melhorou 10X mais…
Nesse trecho de código que eu postei acima (inspirado no seu algorítimo) tem 95 linhas e tem todo o alfabeto, + os numeros…
O do primeiro post tem 139 linhas e só tem 5 botões…

Ou seja, um tem 37 botões com 95 linhas de código
O outro tem 5 botões com 139 linhas de código. Se fosse adicionar os 37 botões seriam umas 450-500 linhas…

Não digo só em linhas não, digo em visualização de código…
No primeiro caso se quisesse adicionar um botão, deveria declarar ele, adicionar ele, criar seu próprio Action Listener…
No segundo basta adicionar ele ao vetor de Strings.

Valeu lina!

lina

Oi,

Que isso… não precisa agradecer.

Uma dúvida: Você fez o Teclado capturar qual janela está em foco pelo SO? ou melhor, se você rodar seu teclado e abrir o notepad, consegue
escrever nele?

Tchauzin!

pedroroxd

lina:
Oi,

Que isso… não precisa agradecer.

Uma dúvida: Você fez o Teclado capturar qual janela está em foco pelo SO? ou melhor, se você rodar seu teclado e abrir o notepad, consegue
escrever nele?

Tchauzin!


Ainda não, rs…
Mas nem xeguei a tentar, até porque essa não era minha intenção…
A minha é de uma tela touch screen, de login, por isso dentro dos campos usuário e senha preciso ter o teclado virtual do programa (só com números e letras)…

Mas, para fazer digitar em qualquer lugar, seria uma espécie de robot não? usando os métodos keypress dele para digitar em qualquer lugar…
Ou não daria certo?

lina

Oi,

Posso te dizer que tentei e não deu muito certo! rs

Se conseguir, por favor me avise :wink:

Tchauzin!

pedroroxd

lina:
Oi,

Posso te dizer que tentei e não deu muito certo! rs

Se conseguir, por favor me avise :wink:

Tchauzin!


Se você tentou e não conseguiu, imagina eu!
kkkk

Vou tentar aqui, vamo ver no que dá! =P

pedroroxd

LINAA!!!
CONSEGUI FAZER O TECLADO VIRTUAL!

public class Virtual extends JDialog {

	private static final long serialVersionUID = 1L;
	private JPanel _jPanelBotoes;
	String[] caracteres;

	public Virtual() {
		setTitle("Teclado Virtual");
		setLayout(new MigLayout());
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setResizable(false);
		// ////
		instanciarcomponentes();
		// /////
		add(_jPanelBotoes, "gaptop20, span");
		// ////
		pack();
		setFocusable(false);
		setLocationRelativeTo(null);
		setAlwaysOnTop(true);
	}

	private void instanciarcomponentes() {
		_jPanelBotoes = new JPanel();
		_jPanelBotoes.setBorder(new TitledBorder(null, "Botões",
				TitledBorder.DEFAULT_JUSTIFICATION,
				TitledBorder.DEFAULT_POSITION, null, new Color(49, 106, 196)));
		_jPanelBotoes.setLayout(new MigLayout());

		caracteres = new String[] { "1", "2", "3", "4", "5", "6", "7", "8",
				"9", "0", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
				"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
				"W", "X", "Y", "Z", "BACKSPACE" };

		JButton[] vetordebotoes = new JButton[caracteres.length];

		// Cria os botões
		for (int cont = 0; cont < caracteres.length; cont++) {
			int i = cont + 1; // i é 1 variável que nunca pode ser 0

			vetordebotoes[cont] = new JButton(caracteres[cont]);

			if (i % 10 == 0) { // se multiplo de 10, adiciona e quebra a linha
				_jPanelBotoes.add(vetordebotoes[cont], "span");
			} else if (cont == caracteres.length - 1) { // o ultimo (backspace)  ocupa a linha inteira)
				_jPanelBotoes.add(vetordebotoes[cont], "grow, span");
			} else { // senão só adiciona
				_jPanelBotoes.add(vetordebotoes[cont]);
			}
			vetordebotoes[cont].setFocusable(false);// não deixa focusable

			vetordebotoes[cont].addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					escreveouapaga(e);
				}
			});
		}
	}

	private void escreveouapaga(ActionEvent e) {
		String digitada = e.getActionCommand();
		int posicao = 0;
		for (int i = 0; i < caracteres.length; i++) {
			if (caracteres[i] == digitada) {
				posicao = i;
			}
		}

		int keyInput[] = { KeyEvent.VK_1, KeyEvent.VK_2, KeyEvent.VK_3,
				KeyEvent.VK_4, KeyEvent.VK_5, KeyEvent.VK_6, KeyEvent.VK_7,
				KeyEvent.VK_8, KeyEvent.VK_9, KeyEvent.VK_0, KeyEvent.VK_A,
				KeyEvent.VK_B, KeyEvent.VK_C, KeyEvent.VK_D, KeyEvent.VK_E,
				KeyEvent.VK_F, KeyEvent.VK_G, KeyEvent.VK_H, KeyEvent.VK_I,
				KeyEvent.VK_J, KeyEvent.VK_K, KeyEvent.VK_L, KeyEvent.VK_M,
				KeyEvent.VK_N, KeyEvent.VK_O, KeyEvent.VK_P, KeyEvent.VK_Q,
				KeyEvent.VK_R, KeyEvent.VK_S, KeyEvent.VK_T, KeyEvent.VK_U,
				KeyEvent.VK_V, KeyEvent.VK_W, KeyEvent.VK_X, KeyEvent.VK_Y,
				KeyEvent.VK_Z, KeyEvent.VK_BACK_SPACE };

		try {
			Robot meurobo = new Robot();
			meurobo.keyPress(KeyEvent.VK_ALT);
			meurobo.keyPress(KeyEvent.VK_TAB);
			meurobo.keyRelease(KeyEvent.VK_TAB);
			meurobo.keyRelease(KeyEvent.VK_ALT);
			meurobo.delay(150);
			meurobo.keyPress(keyInput[posicao]);
		} catch (AWTException e1) {
			e1.printStackTrace();
		}

	}

	public static void main(String[] args) {
		new Virtual().setVisible(true);
	}
}
lina

Oi,

Parabéns!!!.. e obrigada! rs

Apenas usando a classe Robot daria certo mesmo =D

Tchauzin!

pedroroxd

Vlw…
Mas foi uma gambiarra feia akela parte do

meurobo.keyPress(KeyEvent.VK_ALT); meurobo.keyPress(KeyEvent.VK_TAB);
kkkkkk
Não sabia como descobrir onde está o focus, e mesmo dexando always on top e setfocusable(false), não tem como o frame não ficar com o focus…
Por isso fiz essa gambiarra feia, que só da para pessoa perceber se o pc dela for windows vista ou algum otro que tenha o aero…

lina

pedroroxd:
Vlw…
Mas foi uma gambiarra feia akela parte do

meurobo.keyPress(KeyEvent.VK_ALT); meurobo.keyPress(KeyEvent.VK_TAB);
kkkkkk
Não sabia como descobrir onde está o focus, e mesmo dexando always on top e setfocusable(false), não tem como o frame não ficar com o focus…
Por isso fiz essa gambiarra feia, que só da para pessoa perceber se o pc dela for windows vista ou algum otro que tenha o aero…

Oi,

Sim! até no Windows XP dá pra notar! hehehe
pelo menos funciona :wink:

Futuramente vou dar uma olhada melhor nisso…

Tchauzin!

pedroroxd

Não sei se eu não sei, ou se o java não trabalha com aplicações sendo usadas no computador…
Lembro até que estava fazendo um Bot para um jogo, e me falaram para não usar java, pois não tem como você controlar o bot, pois o focus sempre ficaria no jogo… Então você teria que clicar na aplicação java para parar o bot, por exemplo…

Esse teclado virtual já pesquisei em tudo quanto é canto, mas também não axei…
Vamo ver né… Enquanto isso, vamos procurando coisas alternativas, como o alt table! huAHUhuuah

lina

pedroroxd:
Não sei se eu não sei, ou se o java não trabalha com aplicações sendo usadas no computador…
Lembro até que estava fazendo um Bot para um jogo, e me falaram para não usar java, pois não tem como você controlar o bot, pois o focus sempre ficaria no jogo… Então você teria que clicar na aplicação java para parar o bot, por exemplo…

Esse teclado virtual já pesquisei em tudo quanto é canto, mas também não axei…
Vamo ver né… Enquanto isso, vamos procurando coisas alternativas, como o alt table! huAHUhuuah

Oi,

Realmente quando pesquisei não achei nada!

O problema deste teclado, é utiliza-lo em um campo que tenha o evento FocusLost rsrs

Tchauzin!

lina

Oi,

Na minha aplicação, utilizo um teclado virtual exe que encontrei na net.

Para abrir:

Runtime.getRuntime().exec("C:\Temp\VideoTeclado.exe");

Para fecha-lo:

Runtime.getRuntime().exec("taskkill /f /im VideoTeclado.exe");

Tchauzin!

WellingtonRamos

A solução em si não é ruim, mas mudaria um pouco a implementação de modo a manter certos pontos agrupados (como as implementações dos listeners e os setFocusable dos botões.

Ex.: Colocaria todos os botões num List e usaria um for que passaria por todos. Assim, se precisasse adicionar um botão novo, não teria q declarar o mesmo como setFocusable(false). O mesmo seria feito com os listeners (vc pode obter, dentro do listener, qual letra a ser digitada).

Criado 22 de abril de 2010
Ultima resposta 23 de abr. de 2010
Respostas 21
Participantes 4