public static char getchar() {
//mysterious code here
}
Cada vez que o usuário digita um caractere no teclado, esse método “toma conhecimento disso” e retorna o caractere digitado. Além disso, esse método deve funcionar em aplicações de linha de comando. (Acho que consigo “escutar” eventos usando componentes Swing, mas não sei como fazer isso na linha de comando…)
A idéia era fazer o teclado do computador funcionar como um pianinho: na janela de comando, cada vez que eu digitasse uma das teclas C, D, E, F, G, A, B, o método getchar() retornaria o caractere digitado (sem que eu precisasse apertar ENTER), então um outro método transformaria esse caractere na nota musical correspondente.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Teclado extends JFrame implements KeyListener, MouseListener {
private JButton[] key;
public static void main(String[] args) {
new Teclado();
}
public Teclado(){
super("Teclado musical java");
setLayout(new BorderLayout());
setSize(350,100);
initComponents();
setLocationRelativeTo(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
private void initComponents(){
key = new JButton[]{
new JButton("A"),
new JButton("B"),
new JButton("C"),
new JButton("D"),
new JButton("E"),
new JButton("F"),
new JButton("G")
};
JPanel panelkey = new JPanel(new GridLayout(1,7));
for (Integer i=0; i<7; i++){
key[i].addKeyListener(this);
key[i].addMouseListener(this);
key[i].setForeground(Color.BLACK);
key[i].setBackground(Color.WHITE);
key[i].setRolloverEnabled(true);
key[i].setActionCommand(i.toString());
panelkey.add(key[i]);
}
JLabel label = new JLabel("Tecle uma das teclas abaixo");
add(label, BorderLayout.NORTH);
add(panelkey, BorderLayout.CENTER);
}
public void keyTyped(KeyEvent e) {
// Evento não utilizado, porém precisa ser declarado
}
private void keyPressed(Integer intkey){
key[intkey].setForeground(Color.WHITE);
key[intkey].setBackground(Color.BLACK);
key[intkey].setSelected(true);
}
public void keyPressed(KeyEvent e) {
if ("Aa".indexOf(e.getKeyChar())>=0){
keyPressed(0);
} else if ("Bb".indexOf(e.getKeyChar())>=0){
keyPressed(1);
} else if ("Cc".indexOf(e.getKeyChar())>=0){
keyPressed(2);
} else if ("Dd".indexOf(e.getKeyChar())>=0){
keyPressed(3);
} else if ("Ee".indexOf(e.getKeyChar())>=0){
keyPressed(4);
} else if ("Ff".indexOf(e.getKeyChar())>=0){
keyPressed(5);
} else if ("Gg".indexOf(e.getKeyChar())>=0){
keyPressed(6);
}
}
private void keyReleased(Integer intkey){
key[intkey].setForeground(Color.BLACK);
key[intkey].setBackground(Color.WHITE);
}
public void keyReleased(KeyEvent e) {
if ("Aa".indexOf(e.getKeyChar())>=0){
keyReleased(0);
} else if ("Bb".indexOf(e.getKeyChar())>=0){
keyReleased(1);
} else if ("Cc".indexOf(e.getKeyChar())>=0){
keyReleased(2);
} else if ("Dd".indexOf(e.getKeyChar())>=0){
keyReleased(3);
} else if ("Ee".indexOf(e.getKeyChar())>=0){
keyReleased(4);
} else if ("Ff".indexOf(e.getKeyChar())>=0){
keyReleased(5);
} else if ("Gg".indexOf(e.getKeyChar())>=0){
keyReleased(6);
}
}
public void mouseClicked(MouseEvent e) {
// Evento não utilizado, porém precisa ser declarado
}
public void mousePressed(MouseEvent e) {
// Evento não utilizado, porém precisa ser declarado
}
public void mouseReleased(MouseEvent e) {
// Evento não utilizado, porém precisa ser declarado
}
public void mouseEntered(MouseEvent e) {
if (e.getSource() instanceof JButton){
JButton btn = (JButton)e.getSource();
keyPressed(Integer.parseInt(btn.getActionCommand()));
}
}
public void mouseExited(MouseEvent e) {
if (e.getSource() instanceof JButton){
JButton btn = (JButton)e.getSource();
keyReleased(Integer.parseInt(btn.getActionCommand()));
}
}
}
Este JFrame faz aparecer na tela com botões nominados de "A" a "G".
Repare que com a Biblioteca Swing voce tem a opção de usar o teclado e até o mouse e com o mouse, passe-o apenas por cima da letra, sem precisar clicar.
Se voce programar qualquer som, programe dentro do método sobrecarregado "keyPressed(Integer intkey)", pois mesmo passando o mouse por cima da letra, este método é invocado.
Tratar o teclado por KeyListeners como você fez não é forma correta, discorpio. Ela tem o problema de que os keyListeners não funcionam quando o componente não tem foco. A forma certa é fazer como nesse exemplo da calculadora, que usa InputMap e ActionMap: http://www.guj.com.br/posts/list/140986.java
O que você quer na verdade (não ter que esperar pelo enter) não é o getchar(), mas sim o getch().
Desconheço função equivalente no Console do Java, fiz algumas tentativas frustradas (Scanner.next(), System.in.read(), dentre outros), e, por fim, vi alguns depoimentos de pessoas dizendo que tal método não existe no Console Java.
Assim, sugiro que, caso seja realmente necessário implementar essa função no console, em uma aplicação Java, que você utilize um método native do Java, chamando um código em C que faça o trabalho. Deve funcionar!
Infelizmente não acabei o tutorial para ver se realmente funciona pois minha máquina é Windows e as instruções para criar a shared library são para Linux. Deu preguiça de procurar agora as instruções para criar as shared libraries no Windows.
Caso tenha interesse, acho que esse é o caminho. Se testar, por favor, avise aqui no fórum se funcionou!
Abs!
Vini Godoy, realmente voce tem razão, ah e obrigado pela aula, sobretudo eu tive realmente certa dificuldade de configurar estes KeyListeners para o JButton.
Na verdade, desde o Delphi, eventos de teclado foram feitos especificamente para componentes tipo editor de texto, como os TEdit, TDBEdit e TList do Delphi, e no Java, JTextField, JTextPassword e JTextArea, e especificamente para saber se alguma tecla de função foi pressionada, e mesmo assim, só funcionam quando o componente ganha o foco, por isso não é ideal para outros componentes como JButton
Tenho um pergunta pra voce, Vini, pelo código da calculadora que voce apresentou, como eu consigo capturar mais de um envento dentro da classe AbstractAction, enventos do tipo KeyUp, KeyDown, MouseEnter e MouseExit :?:
valeu ter gostado da memoria, tambem acho que ficou bacana, só quero embaralhar automaticamente as imagens de uma forma diferente a cada vez. e se quiser novos jogos, só troco as imagens. mas acho que a interface ainda não está 100 por cento. aquele botao do nao deu ainda, que abre no canto esquerdo, ja que no centro atrapalharia a visao do jogo, nao esta muito bom, e devo fazer graficos para os numeros de cliques, numeros grandes, com setIcon coisa assim.
em programação também tem um link para um jogo de poker muito interessante, gostaria que visse se pudesse, e tem o codigo todo la tambem.
tenho um outro que estava colocando sons, que ja postei aqui, de tabuleiro.
la tem o bingo e o mega-sena. bacana tambem. muita coisa talvez, mas veja só mais um, ou um por dia…
aguardo algum retorno sobre o teclado. depois posto o metodo que conheço para tocar som. direto de um arquivo.