Calculadora com Interface Gráfica Java – java swing

Pergunta:


Comecei a trabalhar com o framework Swing, criando uma calculadora com o JOptionPane, e consegui normalmente. Agora me foi lançado o desafio de inserir botões de +, -, *, e / na calculadora, o problema é que eu pesquisei bastante e não estou conseguindo! Estou usando o JButton e não estou conseguindo saber o que fazer com ele.

Podem postar, se possível, o código completo com comentários me explicando o que faltou no meu, por favor.

Como eu faço pra adicionar a função somar, subtrair, etc. aos botões?

Por favor, se possível e necessário completar o código inteiro, expliquem o que faltou e o que eu devia fazer, pois quero aprender. Se preciso, postarei também o da última calculadora que fiz e deu certo usando apenas o JOptionPane.

Pois bem com a ajuda do @Deyel o meu código ficou assim:

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

public class Calculadora extends JFrame {

    private static final long serialVersionUID = 1L;

    public static void main(String[] args) {
        private JButton botaoMais;
        private JButton botaoMenos;
        private JButton botaoVezes;
        private JButton botaoDividi;
        private JTextField campo;

    public Calculadora() {
        this.setTitle("Exemplo");
        this.setBounds(0,0,250,250);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.getContentPane().setLayout(null);

        botaoMais = new JButton();
        botaoMais.setText("Soma");
        botaoMais.setBounds(30,60,60,30);
        this.add(botaoMais);

        botaoMenos = new JButton();
        botaoMenos.setText("Subtrai");
        botaoMenos.setBounds(30,60,60,30);
        this.add(botaoMenos);

        botaoVezes = new JButton();
        botaoVezes.setText("Multiplica");
        botaoVezes.setBounds(30,60,60,30);
        this.add(botaoVezes);

        botaoDividi = new JButton();
        botaoDividi.setText("Dividir");
        botaoDividi.setBounds(30,60,60,30);
        this.add(botaoDividi);

        campo = new JTextField();
        campo.setBounds(40,50,100,30);
        this.add(campo);

        botaoMais.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {

            }
        }
    }

}

Autor da pergunta Gabriel Ozzy

AndersonBS

Primeiramente parabéns pela sua iniciativa perante ao resto da turma e, não menos importante, seja bem vindo a comunidade Stack Overflow!

Agora vamos ao que interessa…

Percebi que o seu problema não está em criar os botões e a interface, e sim em adicionar uma função a eles, o que chamamos de eventos.

Como os eventos funcionam:

  • Todo sistema operacional que suporta interface gráfica monitora
    eventos (cliques, movimentos do mouse, teclas pressionadas, etc.).

  • Quando um evento acontece o sistema operacional informa ao
    programa.

  • O programa decide o que fazer como evento de acordo como que
    foi programado.

  • São os eventos que controlam todas as interações do usuário com o
    programa (cliques, texto digitado, movimentos do mouse, etc.).

  • Para se trabalhar com eventos no Java a partir dos componentes
    SWING podemos utilizar funcionalidades do pacote java.awt.event.

  • Cada componente da interface gráfica (janela, botão, campo de texto,
    etc.) conta com interfaces para ouvir (listen) quando um evento é
    gerado.

  • Cada interface tem métodos associados para tratar os diferentes
    eventos.

Agora que a gente conhece um pouco melhor como os eventos funcionam, vamos a parte prática!

Escrevi esse exemplo que não possui muita utilidade, mas é ótimo para entender como os eventos funcionam na prática (observe os comentários):

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

public class MeuJFrame extends JFrame {

    private JButton botao;
    private JTextField campo;

    public MeuJFrame() {
        this.setTitle("Exemplo");
        this.setBounds(0, 0, 200, 200);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.getContentPane().setLayout(null);

        botao = new JButton();
        botao.setText("botão");
        botao.setBounds(40, 100, 100, 50);
        this.add(botao);

        campo = new JTextField();
        campo.setBounds(40, 50, 100, 30);
        this.add(campo);

        // Adicionando um evento action ao botão
        botao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {

                // Aqui você escreve qual será a ação do botão ao ser clicado!
                botao.setText(campo.getText());
            }
        });
    } // construtor

    public static void main(String[] args) {
        MeuJFrame exemplo = new MeuJFrame();
        exemplo.setVisible(true);
    } // método main

} // classe

Se você executar o exemplo acima, vai perceber que a ação do botão que adicionei captura o texto inserido no JTextField e o atribui ao texto do botão.

Um print da execução:

Um print da execução

Conclusão:

Com as informações citadas acima, é possível inserir qualquer ação a qualquer botão do seu programa.

Não quis facilitar o seu desafio escrevendo como ficaria um botão de somar por exemplo porque é fazendo que se aprende!

Qualquer dúvida pergunte-me nos comentários, espero ter ajudado.

EDIT:

Como ainda restaram alguma dúvidas, resolvi escrever um protótipo de uma calculadora pra você possuir algo em que se basear:

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

public class Calculadora extends JFrame {

    private JButton numero1;
    private JButton numero2;
    private JButton somar;
    private JButton igual;
    private JTextField display;
    private int leitura;
    private int memoria;
    private char operacao;

    public Calculadora() {
        this.setTitle("Exemplo Botão Somar");
        this.setBounds(0, 0, 267, 235);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.getContentPane().setLayout(null);

        leitura = 0;
        memoria = 0;

        somar = new JButton();
        somar.setText("+");
        somar.setBounds(145, 70, 78, 45);
        this.add(somar);

        igual = new JButton();
        igual.setText("=");
        igual.setBounds(25, 130, 200, 45);
        this.add(igual);

        numero1 = new JButton();
        numero1.setText("1");
        numero1.setBounds(25, 70, 45, 45);
        this.add(numero1);

        numero2 = new JButton();
        numero2.setText("2");
        numero2.setBounds(85, 70, 45, 45);
        this.add(numero2);

        display = new JTextField();
        display.setBounds(25, 25, 200, 30);
        this.add(display);

        numero1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                leitura *= 10;
                leitura += 1;
                display.setText(display.getText() + "1");
            }
        });

        numero2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                leitura *= 10;
                leitura += 2;
                display.setText(display.getText() + "2");
            }
        });

        somar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                operacao = '+';
                memoria += leitura;
                leitura = 0;
                display.setText("");
            }
        });

        igual.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                switch (operacao) {
                    case '+': {
                        memoria += leitura;
                        break;
                    }
                }
                leitura = 0;
                display.setText("" + memoria);
            }
        });
    } // construtor

    public static void main(String[] args) {
        Calculadora exemplo = new Calculadora();
        exemplo.setVisible(true);
    }
} // classe

Um print da execução:

inserir a descrição da imagem aqui

Obs: Ela não é perfeita, existem vários bugs propositais que você terá que solucionar para aprimorar sua lógica de programação… Utilize este código como ponto de partida!

Qual é a ideia do cálculo

A ideia é pegar uma linguagem que tenha o método eval (como python e javascript), que é uma função que pega uma String, converte para uma linha de código e retorna o valor do resultado.

(O “->” significa o retorno)

Exemplo1: eval("5 + 5") -> 10

Exemplo2: eval("10 / (5 + 5)") -> 1

Exemplo3: eval("5 > 3") -> true

Como simular uma linguagem de Script

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
int resultado = (Integer) engine.eval("5 + 5");

getEngineByName(“JavaScript”);
Vai nos retornar uma ScriptEngine, que nos permite usar códigos da linguage

engine.eval(“5 + 5”);
retorna o valor de 5 + 5

(Se não deu pra entender minha explicação ou se precisa de mais alguma ajuda, por favor, me avise)

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *