L'objectiu d'aquest CodeLab és practicar les operacions booleanes i la conversió de tipus.

Realitzarem una Calculadora d'operacions lògiques binaries.

Inicia IntelliJ i crea un nou projecte de tipus Java.

Selecciona la plantilla Command Line App

Posa-li el nom CodeLab2

Fes clic-dreta sobre el package "com.company" i selecciona NEW > GUI Form

En el diàleg "New GUI Form" introdueix les següents dades:

Un cop creat el GUIForm, s'obrirà l'entorn gràfic de disseny:

Aquest entorn permet arrossegar i soltar components al formulari. Hi podem veure tres seccions:

  1. Component Tree - mostra la vista jeràrquica dels components que s'han afegit al formulari. Per a cada component permet definir les seves propietats (Property | Value)
  2. Design area - la vista gràfica del formulari. Els components s'afegeixen arrossegant-los en aquesta àrea
  3. Palette - conté tots els components disponibles que es poden afegir al formulari

Visualitzador de resultats

Arrossega un JTextField desde la paleta i solta'l en l'àrea de disseny. Estableix a la propietat Field name el valor display:

Aquest camp de text és el que utilitzarem com a display o pantalla de la calculadora.

Botons

Afegeix els components JButton de la paleta a l'àrea de disseny. Distribuieix-los en la graella de la següent forma:

Estableix les següents propietats als botons:

Button1: text=AC, field name=ACButton

Button2: text=NOT, field name=NOTButton

Button3: text=OR, field name=ORButton

Button4: text=AND, field name=ANDButton

Button5: text=0, field name=a0Button

Button6: text=1, field name=a1Button

Pots veure una previsualització de l'aspecte del Formulari fent clic-dreta sobre el disseny i selecionant Preview:

Establir el nom del JPanel

Com a pas previ, per a fer funcionar el formulari es requereix establir el camp nom del component JPanel:

Selecciona el JPanel a la finestra Component Tree i canvia la propietat nom a calcView.

Si fas clic sobre l'arxiu Calculadora.java s'haurien de mostrar els següents components inserits:

Calculadora.java

package com.company;

import javax.swing.*;

public class Calculadora {
   private JTextField display;
   private JButton ACButton;
   private JButton NOTButton;
   private JButton ORButton;
   private JButton ANDButton;
   private JButton a0Button;
   private JButton a1Button;
   private JPanel calcView;
}

Per tal de fer que el formulari funcioni es requereix crear un JFrame. Crearem el mètode main() que serà el responsable de crear-lo quan s'executi el programa.

A l'editor de codi de l'arxiu Calculadora.java, fes clic-dreta i selecciona Generate > Form.main()

Ara ja es pot executar el mètode Calculadora.main(). Fes clic-dreta i selecciona Run Calculadora.main()

Per respondre als clics dels botons i realitzar les operacions, cal afegir un Listener a cadascun d'ells. El Listener és l'acció que s'executa quan es fa clic al botó.

Afegeix un Listener a cada botó fent click-dreta sobre ells i seleccionant Create Listener > Action Listener

Després d'afegir un Listener a cada botó, s'haurà afegit a l'arxiu Calculadora.java el següent codi:

Calculadora.java

public Calculadora() {
   ACButton.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {

       }
   });
   NOTButton.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {

       }
   });
   ORButton.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {

       }
   });
   ANDButton.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {

       }
   });
   a0Button.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {

       }
   });
   a1Button.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {

       }
   });
   eqButton.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {

       }
   });
}

El codi que escrivim a cadascun dels mètodes actionPerformed s'executarà quan l'usuari faci clic al botó corresponent.

La memòria de la calculadora

El pas següent és realitzar les operacions binàries seleccionades per l'usuari.

Crearem dues variables de tipus String per a emmagatzemar els valors que l'usuari introdueix com a operands, i una variable de tipus int per a emmagatzemar la operació que desitja realitzar.

private String operand1 = "", operand2 = "";
private char operator = ' ';

És a dir, cada cop que l'usuari pitji els botons a0button o a1button, anirem afegint un 0 o un 1 a l'operand1.

Quan l'usuari pitji el botó ORButton o ANDButton guardarem en la variable operator quina és l'operació que s'ha de fer (el caràcter '|' significarà que l'opreació és OR, i el caràcter '&' significarà que l'operació és un AND). A més a més, guardarem el valor de la variable operand1 en la variable operand2, de forma que el següent operand es vagi emmagatzemant en la variable operand1 (però no perdrem el operand anterior perquè l'haurem guardat en la variable operand2).

Quan es pitji el boto del resultat eqButton només caldrà realitzar la operació indicada en la variable operator, amb els valors del operands operand1 i operand2.

Quan es pitji el botó NOTButton, com aquest operador és unari i no necessita d'un altre operand, directament mostrarem el resultat d'aplicar la operació NOT al valor que hi hagi en aquell moment en la variable operand1.

El botó ACButton és el més senzill de tots, únicament borra la memòria (operand1 i operand2) i neteja el display (resultat).

Botons 0 i 1

L'acció a prendre quan es fa clic als botons 0 i 1, és afegir un 0 o un 1 a l'operand1, i mostrar el valor de l'operand1 al display:

a0Button.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
       operand1 += 0;
       display.setText(operand1);
   }
});

a1Button.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
       operand1 += 1;
       display.setText(operand1);
   }
});

Botó NOT

El NOTButton realitza la operació NOT sobre l'operand1, i escriu el resultat al display:

NOTButton.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
       int decimal = Integer.parseInt(operand1, 2);
       int result = ~decimal;
       display.setText(Integer.toBinaryString(result));
   }
});

Amb aquesta sentència:

int decimal = Integer.parseInt(operand1, 2);

convertim l'String que tenim a la variable operand1 a un nombre enter, interpretada com un nombre binari.

És a dir, si la variable operand1 té els caràcters "101", és convertirà al nombre decimal 5, i no al nombre decimal 101.

A continuació realitzem la operació NOT (~) sobre aquest nombre i emmagatzemem el resultat a la variable result.

Finalment tornem a convertir el resultat d'aquesta operació que tenim a la variable result a un String en binari, i posem aquest text al display.

Botons OR i AND

Aquests botons emmagatzemen el valor del display com a operand2, i netejen el valor de l'operand1 de forma que l'usuari pugui introduir un segon operand. També estableixen la operació a realitzar OR/AND en la variable operator.

ORButton.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
       operator = '|';
       operand2 = operand1;
       operand1 = "";
       display.setText("");
   }
});

ANDButton.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
       operator = '&';
       operand2 = operand1;
       operand1 = "";
       display.setText("");
   }
});

Botó resultat

El botó resultat realitza la operació establerta en la variable operator amb l'operand1 i l'operand2, i estableix el resultat al display:

eqButton.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
       int decimal1 = Integer.parseInt(operand1, 2);
       int decimal2 = Integer.parseInt(operand2, 2);
       int result = operator == '&' ? decimal1 & decimal2 : decimal1 | decimal2;
       display.setText(Integer.toBinaryString(result));

   }
});

Botó AC

El botó AC reseteja el valor de les variables operand1 i operand2, i del display:

ACButton.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
       operand1 = "";
       operand2 = "";
       display.setText("");
   }
});