Dúvidas sobre JTextField / KeyListener

1 resposta
Cornelius

Olá senhores, Estou com uma dúvida: Estou criando uma aplicação, uma calculadora. Já configurei os botões com o ActionListener, usando uma classe interna e está tudo certinho e gostaria de fazer o mesmo com o teclado. Também criei uma classe interna implementando o KeyListener e copiei as ações dos botões nas ações do teclado.
O problema é que mesmo não configurando o KeyListener, usar teclado no JTexField vai funcionar do mesmo jeito. Ou seja, configurei a tecla ‘1’ e na calculadora fica digitado dois ‘1’. Gostaria de desabilitar essa configuração que o JTextField já faz naturalmente, para que apareça os números que eu adiciono da minha maneira no ActionListiner que fiz. Eis o código todo, caso tenham curiosidade:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import Calculos.Calculos;


public class Calculadora extends JFrame {
    JPanel grid01;
    JPanel grid02;
    JPanel grid03;
    JTextField campoCalculadora;
    JButton um;
    JButton dois;
    JButton tres;
    JButton quatro;
    JButton cinco;
    JButton seis;
    JButton sete;
    JButton oito;
    JButton nove;
    JButton zero;
    JButton adicao;
    JButton subtracao;
    JButton multiplicacao;
    JButton divisao;
    JButton limpar;
    JButton igual;
    JButton virgula;
    JButton botaoBranco1;
    JButton botaoBranco2;
    JButton botaoBranco3;


    //Outras variaveis para controle
    Calculos calc;
    boolean controleNum = true;

    public Calculadora(){
        //Instanciando objetos de suporte

        //Instanciando os objetos do 1ºJPanel
        campoCalculadora = new JTextField("0");
        campoCalculadora.setFocusable(true);



        //campoCalculadora.getActionListeners();

        //campoCalculadora.setRequestFocusEnabled(false);

        //Instanciando os objetos do 2ºJPanel
        zero = new JButton("0");
        um = new JButton("1");
        dois = new JButton("2");
        tres = new JButton("3");
        quatro = new JButton("4");
        cinco = new JButton("5");
        seis = new JButton("6");
        sete = new JButton("7");
        oito = new JButton("8");
        nove = new JButton("9");
        adicao = new JButton("+");
        subtracao = new JButton("-");
        divisao = new JButton("/");
        multiplicacao = new JButton("*");
        limpar = new JButton("C");
        igual = new JButton("=");
        virgula = new JButton(",");
        botaoBranco1 = new JButton(" ");
        botaoBranco2 = new JButton(" ");
        botaoBranco3 = new JButton(" ");

        //Arrumando a margem dos botoes
//        Insets formatJButton = new Insets(1,1,1,1);
//        um.setMargin(formatJButton);
//        dois.setMargin(formatJButton);
//        tres.setMargin(formatJButton);
//        quatro.setMargin(formatJButton);
//        cinco.setMargin(formatJButton);
//        seis.setMargin(formatJButton);
//        sete.setMargin(formatJButton);
//        oito.setMargin(formatJButton);
//        nove.setMargin(formatJButton);
//        zero.setMargin(formatJButton);
//
//        adicao.setMargin(formatJButton);
//        subtracao.setMargin(formatJButton);
//        multiplicacao.setMargin(formatJButton);
//        divisao.setMargin(formatJButton);
//        limpar.setMargin(formatJButton);
//        igual.setMargin(formatJButton);
//        virgula.setMargin(formatJButton);



        //Adicionando os objetos no 1ºJPanel - Centro
        grid01 = new JPanel(new GridLayout(1,1));
        grid01.add(campoCalculadora);

        //Adicionando os objetos no 2ºJPanel - Sul
        grid02 = new JPanel(new GridLayout(5,3));
        grid02.add(um);
        grid02.add(dois);
        grid02.add(tres);
        //grid02.add(adicao);

        grid02.add(quatro);
        grid02.add(cinco);
        grid02.add(seis);
        //grid02.add(subtracao);

        grid02.add(sete);
        grid02.add(oito);
        grid02.add(nove);
        //grid02.add(multiplicacao);

        grid02.add(zero);
        grid02.add(subtracao);
        grid02.add(multiplicacao);
        //grid02.add(divisao);

        grid02.add(limpar);
        grid02.add(igual);
        grid02.add(virgula);
        //grid02.add(divisao);

        //Adicionando os objetos no 3ºJPanel - Sul
        grid03 = new JPanel(new GridLayout(5,1));
        grid03.add(adicao);
        grid03.add(divisao);
        grid03.add(botaoBranco1);
        grid03.add(botaoBranco2);
        grid03.add(botaoBranco3);


        //Adicionado as acoes para os objetos
        Ouvinte ov = new Ouvinte();
        OuvinteTeclado ovT = new OuvinteTeclado();

        calc = new Calculos();

        //Adicionando acao dos botoes
        
        um.addActionListener(ov);
        dois.addActionListener(ov);
        tres.addActionListener(ov);
        quatro.addActionListener(ov);
        cinco.addActionListener(ov);
        seis.addActionListener(ov);
        sete.addActionListener(ov);
        oito.addActionListener(ov);
        nove.addActionListener(ov);
        limpar.addActionListener(ov);
        igual.addActionListener(ov);

        adicao.addActionListener(ov);
        subtracao.addActionListener(ov);
        multiplicacao.addActionListener(ov);
        divisao.addActionListener(ov);

        virgula.addActionListener(ov);

        //Acoes das teclas
        campoCalculadora.addKeyListener(ovT);

        this.getContentPane().add(grid01, BorderLayout.NORTH);
        this.getContentPane().add(grid02, BorderLayout.CENTER);
        this.getContentPane().add(grid03, BorderLayout.EAST);
        pack();
        //setSize(300,200);
        this.setTitle("Calculadora");
	this.setVisible(true);
	this.setResizable(false);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

    public static void main(String[] args){



        //JOptionPane.showMessageDialog(null, );
        Calculadora secaoCalculadora = new Calculadora();
    }

    class Ouvinte implements ActionListener{
        public void actionPerformed(ActionEvent evt){

//        KeyListener opa[] = campoCalculadora.getKeyListeners();
//        for(int i = 0; i<opa.length;i++){
//            JOptionPane.showMessageDialog(null, ""+opa[i].toString());
//        }

            if(evt.getSource() == um){
                if(controleNum){
                    campoCalculadora.setText("");
                    controleNum = false;
                }
                campoCalculadora.setText(campoCalculadora.getText()+"1");
                if(calc.getTipoOperacao() == 0)
                    calc.setPrimeiroValor(campoCalculadora.getText());
                else
                    calc.setSegundoValor(campoCalculadora.getText());
            }
            if(evt.getSource() == dois){
                if(controleNum){
                    campoCalculadora.setText("");
                    controleNum = false;
                }
                campoCalculadora.setText(campoCalculadora.getText()+"2");
                if(calc.getTipoOperacao() == 0)
                    calc.setPrimeiroValor(campoCalculadora.getText());
                else
                    calc.setSegundoValor(campoCalculadora.getText());
            }
            if(evt.getSource() == tres){
                if(controleNum){
                    campoCalculadora.setText("");
                    controleNum = false;
                }
                campoCalculadora.setText(campoCalculadora.getText()+"3");
                if(calc.getTipoOperacao() == 0)
                    calc.setPrimeiroValor(campoCalculadora.getText());
                else
                    calc.setSegundoValor(campoCalculadora.getText());
            }
            if(evt.getSource() == quatro){
                if(controleNum){
                    campoCalculadora.setText("");
                    controleNum = false;
                }
                campoCalculadora.setText(campoCalculadora.getText()+"4");
                if(calc.getTipoOperacao() == 0)
                    calc.setPrimeiroValor(campoCalculadora.getText());
                else
                    calc.setSegundoValor(campoCalculadora.getText());
            }
            if(evt.getSource() == cinco){
                if(controleNum){
                    campoCalculadora.setText("");
                    controleNum = false;
                }
                campoCalculadora.setText(campoCalculadora.getText()+"5");
                if(calc.getTipoOperacao() == 0)
                    calc.setPrimeiroValor(campoCalculadora.getText());
                else
                    calc.setSegundoValor(campoCalculadora.getText());
            }
            if(evt.getSource() == seis){
                if(controleNum){
                    campoCalculadora.setText("");
                    controleNum = false;
                }
                campoCalculadora.setText(campoCalculadora.getText()+"6");
                if(calc.getTipoOperacao() == 0)
                    calc.setPrimeiroValor(campoCalculadora.getText());
                else
                    calc.setSegundoValor(campoCalculadora.getText());
            }
            if(evt.getSource() == sete){
                if(controleNum){
                    campoCalculadora.setText("");
                    controleNum = false;
                }
                campoCalculadora.setText(campoCalculadora.getText()+"7");
                if(calc.getTipoOperacao() == 0)
                    calc.setPrimeiroValor(campoCalculadora.getText());
                else
                    calc.setSegundoValor(campoCalculadora.getText());
            }

            if(evt.getSource() == oito){
                if(controleNum){
                    campoCalculadora.setText("");
                    controleNum = false;
                }
                campoCalculadora.setText(campoCalculadora.getText()+"8");
                if(calc.getTipoOperacao() == 0)
                    calc.setPrimeiroValor(campoCalculadora.getText());
                else
                    calc.setSegundoValor(campoCalculadora.getText());
            }

            if(evt.getSource() == nove){//Ações do botão 9
                if(controleNum){
                    campoCalculadora.setText("");
                    controleNum = false;
                }
                campoCalculadora.setText(campoCalculadora.getText()+"9");
                if(calc.getTipoOperacao() == 0)
                    calc.setPrimeiroValor(campoCalculadora.getText());
                else
                    calc.setSegundoValor(campoCalculadora.getText());
            }
            if(evt.getSource() == limpar){//Ações do botão c
                campoCalculadora.setText("");
                calc.limpaPrimeiroValor();
                calc.limpaSegundoValor();
                calc.setTipoOperacao(0);
            }
            if(evt.getSource() == igual){//Ações do botão =
                   campoCalculadora.setText(calc.calcularResultado());
                   calc.setPrimeiroValor(campoCalculadora.getText());
                   calc.setTipoOperacao(0);
                   controleNum = true;
            }

            if(evt.getSource() == adicao){ //Ações do botão +
                if(!campoCalculadora.getText().isEmpty()){
                    if(calc.getTipoOperacao() == 0){
                        calc.setTipoOperacao(1);
                        controleNum = true;
                        
                    }
                    else{
                        campoCalculadora.setText(calc.calcularResultado());
                        calc.setPrimeiroValor(campoCalculadora.getText());
                        calc.setTipoOperacao(1);
                        controleNum = true;
                        calc.limpaSegundoValor();
                    }
                }
            }

            if(evt.getSource() == subtracao){ //Ações do botão -
                    if(calc.getTipoOperacao() == 0){
                        calc.setTipoOperacao(2);
                        controleNum = true;
                        //campoCalculadora.setText("");
                    }
                    else{
                        campoCalculadora.setText(calc.calcularResultado());
                        calc.setPrimeiroValor(campoCalculadora.getText());
                        calc.setTipoOperacao(2);
                        controleNum = true;
                        calc.limpaSegundoValor();
                    }
            }
            if(evt.getSource() == multiplicacao){ //Ações do botão *
                if(!campoCalculadora.getText().isEmpty()){
                    if(calc.getTipoOperacao() == 0){
                        calc.setTipoOperacao(3);
                        controleNum = true;
                    }
                    else{
                        campoCalculadora.setText(calc.calcularResultado());
                        calc.setPrimeiroValor(campoCalculadora.getText());
                        calc.setTipoOperacao(3);
                        controleNum = true;
                        calc.limpaSegundoValor();
                    }
                }
            }
            if(evt.getSource() == divisao){ //Ações do botão /
                if(!campoCalculadora.getText().isEmpty()){
                    if(calc.getTipoOperacao() == 0){
                        calc.setTipoOperacao(4);
                        controleNum = true;
                    }
                    else{
                        campoCalculadora.setText(calc.calcularResultado());
                        calc.setPrimeiroValor(campoCalculadora.getText());
                        calc.setTipoOperacao(4);
                        controleNum = true;
                        calc.limpaSegundoValor();
                    }
                }
            }

            if(evt.getSource() == virgula){
                if(!campoCalculadora.getText().isEmpty() && !campoCalculadora.getText().contains(",")){
                    campoCalculadora.setText(campoCalculadora.getText()+",");
                }
            }
        }
    }

    class OuvinteTeclado implements KeyListener{

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

                if(e.getKeyChar() == KeyEvent.VK_1 || e.getKeyChar() == KeyEvent.VK_NUMPAD1){
                    
                    if(controleNum){
                        campoCalculadora.setText("");
                        controleNum = false;
                    }
                    campoCalculadora.setText(campoCalculadora.getText()+"1");
                    if(calc.getTipoOperacao() == 0)
                        calc.setPrimeiroValor(campoCalculadora.getText());
                    else
                        calc.setSegundoValor(campoCalculadora.getText());
                 }
        }

    }

}

Obrigado, :lol:

1 Resposta

Eric_Yuzo

Para desabilitar a edição do text field use setEditable(false)

Em relação ao keyListener, ele só será disparado pelo componente que estiver registrado como ouvinte. Dê uma olhada neste tópico do Vini Godoy que tem uma ótima explicação sobre ActionMap e InputMap: http://www.guj.com.br/posts/list/140986.java

Criado 18 de outubro de 2010
Ultima resposta 18 de out. de 2010
Respostas 1
Participantes 2