[criando um objeto]

16 respostas
ken420

Pessoal vejam só, tenho um Form contendo 2 campos(2JTextField) CampoA, CampoB, os 2 estao já estão relacionados com o banco de dados, mas minha dúvida é a seguinte, como faco para mim ao digitar um valor do tipo double no CampoA e perder o focu, o meu CampoB pegar o valor do CampoA e aparecer no meu CampoB 20% do valor que eu digitei no CampoA!, é mais uma questão de logica que estou apanhando ;~~ vlw pessoal!

16 Respostas

71C4700

Vc podereia acicionar um listeners no CampoB para que quando o campoA mudar ele ser modificado e vc faria a modificação que necessitase.

ken420

um mais e a logica para fazer capturar o valor no Campo2

rmendes08

Assim, você precisa ler um pouco de documentação, isso será inevitável.

1 - você precisa qual será o evento do campoA que será disparado, se é quando o campo perde o foco, surpreendentemente será algo que tenha LostFocus no nome, é só procurar do controle que você está usando quais eventos ele dispara

2 - depois que você encontrou a classe do evento, você procura na documentação a interface que deve ser implementada para uma classe “escutar” o evento, ou seja, você implementa o listener

3 - esse listener deve ter referências para os campos, de forma que ele possa se registrar no campoA como listener e que tenha acesso ao campoB

4 - tendo implementado a interface e registrado o listener no componente, é só incluir o comportamento no handler correspondente (o método chamado quando o evento ocorre, também tá na documentação)

5 - essa lógica é que vai no handler é bem simples: lê o texto do campoA, converte pra double, multiplica por 0.2, converte pra string e mosta no campo B

ken420

documentação que vc se refere é a api? ngm tem algum esqueminha para mim ver e sabe manipular mais facil?

71C4700

Postarei para que fique aqui pra que alguem deseje.

Separei de uma forma a que ficasse o VIEW separado do CONTROLLER. Espero que goste desta forma de modularizar!

VIEW

import java.awt.event.FocusListener;

/**
 *
 * @author Ricardo Job
 */
public class Tela extends javax.swing.JFrame {

  
    public Tela() {
        initComponents();
    }

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

        valor = new javax.swing.JTextField();
        resultado = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

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

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

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(valor, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addGap(30, 30, 30)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(resultado, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(44, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(valor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(resultado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(23, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>
    public void addFocus(FocusListener evt) {
        // Aqui diminui o acoplamento entre o seu codigo e como será implementado
        valor.addFocusListener(evt);
    }
    public void setMsg(String msg){
        //Aqui vc apenas exibirá os valores
        // No seu caso os 20 %
        resultado.setText(msg);
    }
    
    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JTextField resultado;
    private javax.swing.JTextField valor;
    // End of variables declaration
    }

CONTROLLER

import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.text.JTextComponent;

/**
 *
 * @author Ricardo Job
 */
public class Controle {

    private Tela tela; // Sua aplicação visual


    public Controle() {
        tela = new Tela();
        tela.setVisible(true);
        tela.addFocus(new PercentualFocus());

    }

    // Classe resposnsavel por controlar o Focus
    // Voce poderia implementar o metodo focusGained
    private class PercentualFocus extends FocusAdapter {

        @Override
        public void focusLost(FocusEvent e) {
            if (e.getSource() instanceof JTextComponent) {
                JTextComponent component = (JTextComponent) e.getSource();
                String text = component.getText(); // Captura o valor presente na primeira caixa de texte

                try {
                    double valor = Double.parseDouble(text);
                    valor *= 1.2;
                    tela.setMsg("" + valor); // Envia pra interface visual o valor ja convertido

                } catch (NumberFormatException ex) {
                    tela.setMsg("Erro pra converte!");
                }
            }
        }
    }

    public static void main(String... args) {
        Controle init =  new Controle();
    }
}

Veja se soluciona seu problema!

ken420

Meu deus concerteza vai me ajudar muito obrigado pela sua gentileza vlw mesmo amigo vou dar uma estuda no seu codigo! muito obrigado rmendes e 71C4700

ken420
try {   
                    double valor = Double.parseDouble(text);   
                    valor *= 1.2;   
                    tela.setMsg("" + valor); // Envia pra interface visual o valor ja convertido   
  
                } catch (NumberFormatException ex) {   
                    tela.setMsg("Erro pra converte!");   
                }

essa é a parte que faz o calculo no caso e creio que seja ai que terei que implementar o q preciso, veja só se eu fizer a soma digitando apenas numeros ele faz o calculo e joga do otro lado mas eu preciso fazer soma do tipo double porem que suporte virgula EX: 100,00 o que teria que implementar?

71C4700

Adiciona esta linha de codigo que fiz um teste e funcionou!

/// Esta linha é adicionado!
                text = text.replaceAll(",", "."); // Ele remove a virgula e coloca ponto no local
                try {
                    double valor = Double.parseDouble(text);
                    valor *= 1.2;
                    tela.setMsg("" + valor); // Envia pra interface visual o valor ja convertido

                } catch (NumberFormatException ex) {
                    tela.setMsg("Erro pra converte!");
                }

Veja ai se funciona!

Ou vc poderia tambem Converte para um ourto tipo antes de fazer a conversão pra double, não me recordo agora como, mas acreditoque tem jeito! Logico caso nao funcione este ai!

ken420

perfeito funcionou certinho porem no campo B(campo do resultado) por ex: digito 1000,00 no campo A, no campoB invéz de aparecer 200,00 ele aparece assim 200.0 tem como mudar isso tambem? pq o parâmetro do meu text ja é isso

text = text.replaceAll(",", ".");

em q lugar editaria as propriedades do campoB?

71C4700

Fiz uns teste aqui,

text = text.replaceAll(",", ".");
                try {
                    double valor = Double.parseDouble(text);
                    valor *= 1.2;
                    // Aqui voce declara como será a formatação do numero
                    DecimalFormat format = new DecimalFormat("###.00"); 
                    // Este seria o numero já formatado 
                    String numberFormat = format.format(valor);
                    // Envia pra interface visual o valor ja convertido
                    tela.setMsg(numberFormat); 

                } catch (NumberFormatException ex) {
                    tela.setMsg("Erro pra converte!");
                }

Veja se funciona ai!

ken420

71C4700 cara deu certo ele faz o calculo 100,00 mas preciso te enche o saco a ultima vez se eu faço uma conta de 10,000,00 ele nao converte! mas se eu fizer 1000,00 ele converte, consegui faze ele somar 10,000,00 mas se eu digitar 100,00 ai quem nao converte eh o 100,00 tentei da uma mechida aqui

DecimalFormat format = new DecimalFormat("#,#00.00#");

mas nao estou tendo sucesso se vc souber fico mais agradecido ainda e vlw !

71C4700

Fiz alguns testes funcionou aqui.

Sou sincero este demorou mais. EHehehEeh

//Encontra a ultima virgula 
                int lastComma = text.lastIndexOf(",");
                
                // So passa caso exista alguma virgula
                if (lastComma != -1) {
                    StringBuffer prefix = new StringBuffer(text);

                    // Substitui esta virgula pelo ponto
                    prefix.setCharAt(lastComma, '.');

                    // Agora teria todas as virgulas
                    text = prefix.toString().replaceAll(",", "");
                }

                try {
                    double valor = Double.parseDouble(text);
                    valor *= 1.2;

                    // Aqui voce declara como será a formatação do numero
                    DecimalFormat format = new DecimalFormat("##,###.00");

                    // Este seria o numero já formatado 
                    String numberFormat = format.format(valor);
                    // Envia pra interface visual o valor ja convertido
                    tela.setMsg(numberFormat);

                } catch (NumberFormatException ex) {
                    System.out.println("Erro : " + ex.getMessage());
                    tela.setMsg("Erro pra converte!");
                }

Veja se funciona ai!

ken420

veja só o erro que deu quando digitei para ele somar 10,000,00 ele da erro multiple points
porem se eu colocar 10000,00 com apenas 1 virgula ele soma certo

71C4700

Tente aplicar o codig postado a cima, ele nao troca todas as virgulas por ponto, inclusive por este motivo o desenvolvi.

Veja o que acontece, ele troca somente a ultima virgula o restante ele converte como se fosse nada, ou seja, ele TIRA todas as demais virgula!

Espero pela resposta!

ken420

entendi, resolveu meu problema muito obrigado pela atencao fera! vlw mesmo abracao!

71C4700

Resolveu mesmo? Fico feliz por poder ajudar…

Vlw

Criado 3 de março de 2009
Ultima resposta 5 de mar. de 2009
Respostas 16
Participantes 3