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!
[criando um objeto]
16 Respostas
Vc podereia acicionar um listeners no CampoB para que quando o campoA mudar ele ser modificado e vc faria a modificação que necessitase.
um mais e a logica para fazer capturar o valor no Campo2
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
documentação que vc se refere é a api? ngm tem algum esqueminha para mim ver e sabe manipular mais facil?
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!
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
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?
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!
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?
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!
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 !
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!
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
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!
entendi, resolveu meu problema muito obrigado pela atencao fera! vlw mesmo abracao!
Resolveu mesmo? Fico feliz por poder ajudar…
Vlw