Teclado Numérico Virtual

4 respostas
A

Iae galera…

estou criando um teclado numérico virtual para minha aplicação java swing…
só que estou encontrando dificuldades em 2 pontos

1º como faço para que o sistema pressione a tecla enter quando o usuário clicar no botão enter do teclado virtual?

2º tenho um jbutton dentro do jtextfield com uma imagem de um teclado … esse botão chama o teclado virtual que por sua vez escreve no jtextfield… porém conforme o texto vai crescendo dentro do campo os dígitos ficam atras do botão ou seja, estão escondidos atras do botão … como eu poderia fazer para que quando o texto se aproximasse do botão ele não passar por traz do botão e sim ir continuando o texto como se o campo terminasse onde começa o botão?

segue o codigo que fiz para o teclado virtual:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;

/**
 *
 * @author Visitante
 */
public class TecladoVirtual extends JPanel{
    
    private JTextField txt;
    private String[] teclas = {"7", "8", "9", "4", "5", "6", "1", "2", "3", "0", ",", "←"};
    private ArrayList<JButton> botoes = new ArrayList<JButton>();
    private JPanel pNumeros, pEnter;
    private JPopupMenu pop;
    
    private ImageIcon icone;
    private JButton botao;
    
    public TecladoVirtual() {};
    
    public JTextField getTecladoNumerico(JTextField t) {
        
        txt = t;
        configuraCampoNumerico();
        return txt;
        
    }
    
    private void configuraCampoNumerico() {
        
        configuraBotaoNumerico();
        
        pNumeros = new JPanel();
        setLayout(new BorderLayout());
        pNumeros.setLayout(new GridLayout(4, 3, 0, 0));
        
        ActionListener acao = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JButton b = (JButton)e.getSource();
                if (!b.getText().equalsIgnoreCase("Enter") && !b.getText().equalsIgnoreCase("&#8592;")) {
                    txt.setText(""+txt.getText()+b.getText());
                } else if (b.getText().equalsIgnoreCase("&#8592;")) {
                    txt.setText(txt.getText().length() > 0 ? ""+txt.getText().substring(0, txt.getText().length() - 1) : "");
                } else {
                    txt.requestFocus();
                    pop.setVisible(false);
                }
            }
        };
        
        for(int i = 0; i < teclas.length; i++) {
            JButton b = new JButton(teclas[i]);
            b.addActionListener(acao);
            pNumeros.add(b);
            botoes.add(b);
        }
        
        pEnter = new JPanel(new GridLayout(1, 3, 0, 0));
        JButton bEnter = new JButton("Enter");
        bEnter.addActionListener(acao);
        pEnter.add(bEnter);
        
    }
    
    private void configuraBotaoNumerico() {
        
        icone = new ImageIcon(getClass().getResource("/cpadivisual/imagem/teclado.png"));
        botao = new JButton(icone);
        botao.setBackground(new Color(0, 0, 0, 0));
        
        botao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Component parent = ((JButton)e.getSource()).getParent();  
                ((JTextField)parent).requestFocus();  
                
                pop = new JPopupMenu();
                pop.add(pNumeros);
                pop.add(pEnter, BorderLayout.SOUTH);
                pop.setVisible(true);
                pop.setLocation(txt.getLocationOnScreen().x+112, txt.getLocationOnScreen().y-1);
            }
        });
        
        txt.setLayout(new BorderLayout());
        txt.add(botao, BorderLayout.EAST);
        
    }
    
}

agora o codigo de chamada do teclado:

TecladoVirtual teclado = new TecladoVirtual();
textFieldVirtualKey = teclado.getTecladoNumerico(textFieldVirtualKey);

desde já agradeço a ajuda!!

4 Respostas

D
  1. O sistema precisa pressionar a tecla enter pra algum motivo específico? Não seria mais fácil já chamar a função que seria chamada pelo “enter” normal?

  2. Você pode fazer uma estimativa de quantos caracteres são necessários para que o texto fique por baixo do botão do teclado e ir verificando a medida que vai digitando… quando chegar no tamanho que vai ficar embaixo do botão, você faz o botão do teclado desaparecer.

A

Olá diogo,

obrigado por responder

no primeiro caso eu preciso realmente emular a tecla enter pelo botão … pois estou fazendo adaptação no sistema para monitor touch e praticamente todos os campos numéricos terão essa funcionalidade

no segundo caso gostei da sua ideia … vou ver como posso implementar ela aqui…

A

Iae galera,

resolver os problemas pedidos anteriormente retirando o botao de dentro do textfield e o colocando fora como segue na classe abaixo:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.Normalizer;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;

/**
 *
 * @author Visitante
 */
public class TecladoVirtual extends JPanel{
    
    public static int NUMERICO = 0;
    public static int ALFANUMERICO = 1;
    
    private JTextField txt;
    private String[] teclasNumericas = {"7", "8", "9", "4", "5", "6", "1", "2", "3", "0", ",", "&#8592;"};
    private String[] teclasAlfaNumericas = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "(", ")", "&#8592;",
                                            "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", ",", ".", "/", "@", "_", "-"};
    
    private ArrayList<JButton> botoes = new ArrayList<JButton>();
    private JPanel pNumeros, pCaracteres, pEspaco, pEnter;
    private JPopupMenu pop;
    
    private ImageIcon icone;
    private JButton botao;
    
    private Acao acao = new Acao();
    private AcaoBotao acaoBotao = new AcaoBotao();
    
    private String acento = "";
    
    public TecladoVirtual() {}
    
    public JButton getBotaoTecladoVirtual(JButton btn, JTextField t, int tipoTeclado) {
    
        txt = t;
        botao = btn;
        configuraCampo(tipoTeclado);
        configuraBotao(tipoTeclado);
        
        return botao;
        
    }
    
    private void configuraCampo(int tipoTeclado) {
        
        if (tipoTeclado == NUMERICO) {
            
            pNumeros = new JPanel();
            setLayout(new BorderLayout());
            pNumeros.setLayout(new GridLayout(4, 3, 0, 0));

            for(int i = 0; i < teclasNumericas.length; i++) {
                JButton b = new JButton(teclasNumericas[i]);
                b.addActionListener(acao);
                pNumeros.add(b);
                botoes.add(b);
            }
            
        } else {
            
            pCaracteres = new JPanel();
            setLayout(new BorderLayout());
            pCaracteres.setLayout(new GridLayout(4, 13, 0, 0));

            for(int i = 0; i < teclasAlfaNumericas.length; i++) {
                JButton b = new JButton(teclasAlfaNumericas[i]);
                b.addActionListener(acao);
                pCaracteres.add(b);
                botoes.add(b);
            }

            pEspaco = new JPanel(new GridLayout(1, 1, 0, 0));
            JButton bEspaco = new JButton("Espaço");
            bEspaco.addActionListener(acao);
            pEspaco.add(bEspaco);
            
        }
        
        pEnter = new JPanel(new GridLayout(1, 1, 0, 0));
        JButton bEnter = new JButton("Enter");
        bEnter.addActionListener(acao);
        pEnter.add(bEnter);
        
    }
    
    private JButton configuraBotao(int tipoTeclado) {
        
        icone = new ImageIcon(getClass().getResource("/cpadivisual/imagem/teclado.png"));
        botao.setIcon(icone);
        botao.setText("");

        
        acaoBotao.setTipoTeclado(tipoTeclado);
        botao.addActionListener(acaoBotao);
        
        return botao;
        
    }
    
    private class Acao implements ActionListener{
        public void actionPerformed(ActionEvent e) {
            JButton b = (JButton)e.getSource();
            
            if (b.getText().equalsIgnoreCase("Enter")) {
                txt.requestFocus();
                pop.setVisible(false);
                
            } else if (b.getText().equalsIgnoreCase("Espaço")) {
                txt.setText(txt.getText()+" ");
                
            } else if (b.getText().equalsIgnoreCase("&#8592;")) {
                txt.setText(txt.getText().length() > 0 ? ""+txt.getText().substring(0, txt.getText().length() - 1) : "");
            
            } else if (b.getText().equalsIgnoreCase("`")) {
                acento = "\u0300";
                
            } else if (b.getText().equalsIgnoreCase("'")) {
                acento = "\u0301";
            
            } else if (b.getText().equalsIgnoreCase("^")) {
                acento = "\u0302";
                
            } else if (b.getText().equalsIgnoreCase("~")) {
                acento = "\u0303";
                
            } else {
                if (!"".equalsIgnoreCase(acento) && b.getText().matches("[AEIOU]+")) {
                    String l = Normalizer.normalize(b.getText() + acento, Normalizer.Form.NFC);
                    txt.setText("" + txt.getText() + l);
                } else {
                    txt.setText(""+txt.getText()+b.getText());
                }
                acento = "";
            }
            
        }
    }
    
    private class AcaoBotao implements ActionListener {
        
        private int tipoTeclado;
        
        public void actionPerformed(ActionEvent e) {
            txt.requestFocus();

            pop = new JPopupMenu();
            
            if (tipoTeclado == NUMERICO) {
                pop.add(pNumeros);
            } else {
                pop.add(pCaracteres);
                pop.add(pEspaco, BorderLayout.SOUTH);
            }
            
            System.out.println("chegou na acao do botao!");
            
            pop.add(pEnter, BorderLayout.SOUTH);
            pop.setVisible(true);
            pop.setLocation(txt.getLocationOnScreen().x+112, txt.getLocationOnScreen().y-1);
        }
        
        public void setTipoTeclado(int tipoTeclado) {
            this.tipoTeclado = tipoTeclado;
        }
        
    }
    
}

implementei também outro teclado junto a essa classe … então tenho o teclado numérico apenas e um outro teclado alfanumérico o que está me atendendo perfeitamente…

minha duvida agora é a segunte …
para chamar esse teclado eu crio um JButton dessa maneira:

TecladoVirtual teclado = new TecladoVirtual();
btnTeclado = teclado.getBotaoTecladoVirtual(btnTeclado, textFieldVirtualKey, teclado.ALFANUMERICO);

porém estou passando estaticamente o campo onde o teclado virtual vai escrever…

o que eu quero saber é como faço para pegar o campo que está com foco no formulário e passa-lo para essa função para que o teclado escreva em qualquer campo de formulário e que eu não precise criar um botão para cada campo passando ele estaticamente???

desde já grato pela ajuda

A

Alguém?

Criado 1 de novembro de 2012
Ultima resposta 5 de nov. de 2012
Respostas 4
Participantes 2