Problema com KeyPressed atrasado

5 respostas
Tagliatti

Olá pessoal estou fazendo um conversor de base que de acordo com que o usuário vai digitando ele vai convertendo, mas o problema que o evento KeyPressed está atrasado. EX: se eu abro o programa e digito 1 em decimal ele não faz nada nos outros Text Fields. Se eu pressionar um novo numero ele mostra o que ele deveria ter mostrado antes, e assim por diante, ou seja, ele fica sempre atrasado um numero.
Como eu resolvo isso?
Obrigado.

public class Main extends javax.swing.JFrame {

    public Main() {
        initComponents();
    }
    
    private String decToBinary(long dec) {
        String result = "";

        while (dec > 0) {
            result = (dec & 1) + result;
            dec >>= 1;
        }

        return result;
    }

   private int binaryToDec( String bin ) {
     int i, result = 0;

     for( i = 0; i < bin.length(); i++ ) {
       result <<= 1;
       if( bin.charAt( (int) i) == '1' ) result++;
     }

     return result;
   }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        binario = new javax.swing.JTextField();
        octal = new javax.swing.JTextField();
        decimal = new javax.swing.JTextField();
        hexadecimal = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Conversor de Base");
        setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        setName("janela"); // NOI18N
        setResizable(false);

        binario.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        octal.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        decimal.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        decimal.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                decimalKeyPressed(evt);
            }
        });

        hexadecimal.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jLabel1.setText("Binario");

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jLabel2.setText("Octal");

        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jLabel3.setText("Decimal");

        jLabel4.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jLabel4.setText("Hexadecimal");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(binario, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addContainerGap(348, Short.MAX_VALUE)
                        .addComponent(jLabel1))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addContainerGap(359, Short.MAX_VALUE)
                        .addComponent(jLabel2))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(octal, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addContainerGap(344, Short.MAX_VALUE)
                        .addComponent(jLabel3))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(decimal, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addContainerGap(315, Short.MAX_VALUE)
                        .addComponent(jLabel4))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(hexadecimal, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(25, 25, 25)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(binario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(octal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(decimal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel4)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(hexadecimal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(78, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void decimalKeyPressed(java.awt.event.KeyEvent evt) {
        if (!decimal.getText().isEmpty()) {
            octal.setText(Long.toOctalString(Long.parseLong(decimal.getText())));
            hexadecimal.setText(Long.toHexString(Long.parseLong(decimal.getText())));
            binario.setText(decToBinary(Long.parseLong(decimal.getText())));
        } else {
            octal.setText("");
            hexadecimal.setText("");
            binario.setText("");
        }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JTextField binario;
    private javax.swing.JTextField decimal;
    private javax.swing.JTextField hexadecimal;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JTextField octal;
    // End of variables declaration

}

5 Respostas

sf.marcius

opa, blz?

ja tentou usar o KeyReleased em vez do KeyPressed?
isso ja tinha acontecido comigo tbém, e se nao me engano, foi só trocar.

[]s

Tagliatti

Fusionou perfeitamente, muito obrigado pela dica.

ViniGodoy

Os eventos de KeyPress e KeyRelease não são a forma correta de se resolver esse tipo de problemas usando o JTextField.
Uma forma simples de acabar com sua lógica é colar texto com o mouse sobre o campo. Ele não dispara o evento.

No lugar, prefira usar o Document, como descrito nesse artigo:
http://www.guj.com.br/articles/29

Tagliatti

Vlw pela dica ViniGodoy, eu até tentei usar, mas como estou usando 4 JTextField não sei porque só deu certo com 1 deles, na hora que eu coloquei nos outros começou a dar muitas exceções. Vou ler o artigo e ver se aprendo mais.
Obrigado.

bryankaue

Nossa, muito obrigado.
Estava precisando disso e não encontrava

Criado 23 de março de 2011
Ultima resposta 18 de jun. de 2011
Respostas 5
Participantes 4