Como implementar getchar() em Java?

Como se implementa a função getchar() em Java?

Penso nela assim:

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.

o que vc quer é pegar o evento de uma tecla pressionada certo?

todos os componentes do swing da para fazer este handler:

SWING_COMPONENT.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
    System.out.println("PRESSED: " + evt.getKeyCode() + " - " + evt.getKeyChar());
}
public void keyReleased(java.awt.event.KeyEvent evt) {
    System.out.println("RELEASED: " + evt.getKeyCode() + " - " + evt.getKeyChar());
}});

só procurar por “java swing keypress” tem muita documentação sobre isto:

http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/events/keylistener.html

assim vc pega qualquer tecla q seja pressionada no teclado, no momento exato em q a tecla é pressionada e soltada…

No console não tem como. Aliás, o java é muito pobre em relação ao console.

Talvez numa emulação como o Charva você consiga o que você quer.

Boa tarde a todos.

Vê se este JFrame te serve:

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.

Espero ter te ajudado.

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

http://packard.flint.umich.edu/~hickslm/313/exceptions/GetChar.html

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! :wink:

Abaixo vai um link que explica como chamar um código C a partir de um código Java.
http://www.javaworld.com/javaworld/javatips/jw-javatip23.html

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!

interessante este arquivo do teclado. do discorpio, vc tem com a música funcionando?

eu tenho um jogo de memoria em java, onde treinei estes conceitos.

http://www.raghyjose.net/memoria.php
tem o jogo em zip no final com as imagens, vale conferir.

me interesso por musica . em basic era muito facil,

SOUND

fazer um som. em java so consegui chamar arquivos, de som.

nao tem como chamar as notas musicais com simples comandos?

e quando o vini diz console , se refere ao teclado nao entendi?
aguardo

[quote=raghy]e quando o vini diz console , se refere ao teclado nao entendi?
aguardo [/quote]

Ele diz isto aqui:

Boa tarde a todos.

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 :?:

Um abraço a todos.

e tem com musica funcionando aquele exemplo do teclado, discorpio?

Boa noite a todos.

Infelizmente não amigo Raghy, o código que postei eu fiz de improviso e na hora que estava lendo este post.

Entretanto, tem como fazer como música, estou baixando uma API do Java, no link abaixo, chamada Java Sound API que sintetiza arquivos do tipo midi.

http://java.sun.com/products/java-media/sound/samples/JavaSoundDemo/

A propósito, achei muito intuitivo o seu jogo da memória, parabéns.

Estou testando essa API, e se der pra fazer no código que postei, eu coloco aqui, só que pretendo utilizar o código do Vini Godoy que é mais prático

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.

veja meu novo post do general que quero fazer

ee no site www.raghyjose.net/indexatual.php

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.