Hacer una calculadora en java, cómo permitir que las entradas numéricas sólo

Estoy tratando de hacer una calculadora en Java/eclipse. ¿Cómo puedo hacer que sólo los valores numéricos se pueden escribir en el área de texto? Así que cuando ejecuto la aplicación funciona perfectamente. Todos los botones funcionan perfectamente. Pero me gustaría tener sólo permiten número de entrada en el área de texto.

    import java.awt.Color;
  import java.awt.FlowLayout;
import java.awt.LayoutManager;
import java.awt.TextField;

  import javax.swing.JButton;
  import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
 import java.text.ParseException; 
  import java.util.Scanner;

   public class calculator_gui<reutrn> implements ActionListener {

JFrame frame = new JFrame("Calculator");
JPanel Panel = new JPanel (new java.awt.FlowLayout());

JTextArea text = new JTextArea(1,20);
JButton but1= new JButton("1");
JButton but2= new JButton("2");
JButton but3= new JButton("3");
JButton but4= new JButton("4");
JButton but5= new JButton("5");
JButton but6= new JButton("6");
JButton but7= new JButton("7");
JButton but8= new JButton("8");
JButton but9= new JButton("9");
JButton but0= new JButton("0");


JButton butadd= new JButton("+");
JButton butsub= new JButton("-");
JButton butmulti= new JButton("*"); 
JButton butdiv= new JButton("/");
JButton buteq= new JButton("=");
JButton butclear= new JButton("C");

Double number1,number2,result;
int addc=0,subc=0,multic=0,divc=0;



public void gui(){

    Panel.setLayout(FlowLayout());
    frame.setVisible(true);
    frame.setBounds(100, 100, 450, 285);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     // frame.setResizable(false);

    frame.add(Panel);
    Panel.setBackground(Color.green);

    Panel.add(text);
    text.setBounds(10, 32, 361, 29);



    Panel.add(but1);
    but1.setBackground(Color.red);
    but1.setBounds(10, 81, 89, 23);

    Panel.add(but2);
    but2.setBounds(126, 81, 89, 23);

    Panel.add(but3);
    but3.setBounds(225, 81, 89, 23);

    Panel.add(but4);
    but4.setBounds(10, 115, 89, 23);

    Panel.add(but5);
    but5.setBounds(126, 115, 89, 23);

    Panel.add(but6);
    but6.setBounds(225, 115, 89, 23);

    Panel.add(but7);
    but7.setBounds(10, 149, 89, 23);

    Panel.add(but8);
    but8.setBounds(126, 149, 89, 23);

    Panel.add(but9);
    but9.setBounds(225, 149, 89, 23);

    Panel.add(but0);
    but0.setBounds(126, 183, 89, 23);

    Panel.add(butadd);
    butadd.setBounds(324, 81, 89, 23);

    Panel.add(butsub);
    butsub.setBounds(324, 115, 89, 23);

    Panel.add(butmulti);
    butmulti.setBounds(324, 183, 89, 23);

    Panel.add(butdiv);
    butdiv.setBounds(324, 149, 89, 23);

    Panel.add(buteq);
    buteq.setBounds(225, 183, 89, 23);

    Panel.add(butclear);
    butclear.setBounds(10, 183, 89, 23);





    but1.addActionListener(this);
    but2.addActionListener(this);
    but3.addActionListener(this);
    but4.addActionListener(this);
    but5.addActionListener(this);
    but6.addActionListener(this);
    but7.addActionListener(this);
    but8.addActionListener(this);
    but9.addActionListener(this);
    but0.addActionListener(this);
    butadd.addActionListener(this);
    butsub.addActionListener(this);
    butmulti.addActionListener(this);
    butdiv.addActionListener(this);
    buteq.addActionListener(this);
    butclear.addActionListener(this);






}

private LayoutManager FlowLayout() {
    //TODO Auto-generated method stub
    return null;
}

@Override
public void actionPerformed(ActionEvent e){

  Object source = e.getSource();

  if(source==butclear){

      number1=0.0;
      number2=0.0;
      text.setText(null);

  }


  if(source==but1){  
       text.append("1");        

  }


  if(source==but2){  
       text.append("2");        

  }

  if(source==but3){  
       text.append("3");        

  }

  if(source==but4){  
       text.append("4");        

  }

  if(source==but5){  
       text.append("5");        

  }

  if(source==but6){  
       text.append("6");        

  }

  if(source==but7){  
       text.append("7");        

  }

  if(source==but8){  
       text.append("8");        

  }

  if(source==but9){  
       text.append("9");        

  }

  if(source==but0){  
       text.append("0");        

  }
  if(source==butadd){
      number1=number_reader();
      text.setText("");
      addc=1;
      subc=0;
      multic=0;
      divc=0;


  }

  if(source==butsub){
      number1=number_reader();
      text.setText("");
      addc=0;
      subc=1;
      multic=0;
      divc=0;


  }
  if(source==butmulti){
      number1=number_reader();
      text.setText("");
      addc=0;
      subc=0;
      multic=1;
      divc=0;


  }
  if(source==butdiv){
      number1=number_reader();
      text.setText("");
      addc=0;
      subc=0;
      multic=0;
      divc=1;


  }



  if(source==buteq){

      number2=number_reader();
      if(addc>0){
          result=number1+number2;
          text.setText(Double.toString(result));

      }

  if(subc>0){
      result=number1-number2;
      text.setText(Double.toString(result));          
  }

  if(multic>0){
      result=number1*number2;
      text.setText(Double.toString(result));

  }




    }







     if(divc>0){
      result=number1/number2;
      text.setText(Double.toString(result));

           }


       }




public double number_reader(){
    Double num1;
    String s;
    s=text.getText();
    num1=Double.valueOf(s);

    return  num1;


        }




      }
InformationsquelleAutor epsilon58 | 2013-04-02

2 Kommentare

  1. 1

    Hay un número de cosas que usted puede hacer.

    • Establecer un javax.swing.InputVerifier en el área de texto. Esto va a mantener a la gente de tabulación si se escribe algo ilegal. Probablemente no es suficiente.
    • Establecer una costumbre Document para la JTextArea en su constructor. El uso de una subclase de escribir de PlainDocument, donde anular su insertText método y rechazar no números. Este se encargará de tanto escribir y de cortar-y-pegar.

    Que va a hacer mejor en su siguiente intento si usted no tiene uno gigante actionPerformed método para todos los número y botones de operación. En su lugar, dar a cada botón una subclase de AbstractAction. El número de botones que pueden compartir instancias de una clase.

    JComponents, que incluyen JButtons, puede tener propiedades del cliente, así que usted puede escribir código como

    JButton but1= new JButton("1");
    but1.setClientProperty("digit", "1");  //Why a string? 
        //Suppose you have a switch to use hexadecimals?

    y, a continuación, la acción oyente, que tiene acceso al botón pulsado, puede llamar getClientProperty("digit") en lo más dígitos que el usuario ha elegido. Por una pequeña inversión, ahorrar un montón de código repetitivo.

    Por último, aprender el patrón modelo-vista-controlador de la arquitectura, o MVC. No realice manipulaciones directamente en el área de texto. Sin RFC, usted tendrá muchos problemas de adición de más operaciones, o cambiar a una calculadora RPN.

    1. Crear un Modelo: Este tiene objetos para el acumulador y el nuevo operando.
    2. Crear una Vista: La Oscilación de la instalación.
    3. Crear un Controlador: Los objetos que hacen el trabajo. Sus acciones deben ser las solicitudes de la controladora para hacer algo. El controlador debe hacer en el modelo y, a continuación, el modelo o el controlador debe actualizar la vista.

    También, su calculadora clase de nombre es un poco raro. El nombre calculator_gui<reutrn> no tiene sentido; ¿por qué un genérico? Por qué violar Java normas? Sólo tiene que llamar a Calculator.

    Añadido

    El cartel me quiere mostrar cómo activar el botón de creación del consejo de europa en un bucle. Así, vuelva a colocar los diez líneas:

    JButton but1= new JButton("1");
    JButton but2= new JButton("2");
    JButton but3= new JButton("3");
    JButton but4= new JButton("4");
    JButton but5= new JButton("5");
    JButton but6= new JButton("6");
    JButton but7= new JButton("7");
    JButton but8= new JButton("8");
    JButton but9= new JButton("9");
    JButton but0= new JButton("0");

    en:

    JButton[] digitButton = new JButton[10];  //digitButton is an arry of JButtons,
                                              //Initialized to nulls.
    for(final int i = 0; i < 10; i++) {
        digitButton[i] = new JButton(Integer.toString(i));  //Convert 0 to "0", etc.
                                                            //Then make a button.  
    }

    Ahora, dar a cada botón de su propia acción escucha en lugar de tener la clase principal de tener uno para todos.

    • Sólo he sido de codificación por casi 2 semanas. No tengo una buena comprensión de la lengua, tratando de averiguar .
    • también puede que le enseñe cómo usar el método documento que usted ha mencionado
    • Lo siento. Tiendo a ser demasiado académico, aunque he estado en el mundo comercial por más de 20 años. Me hizo elegir un número de ocultar técnicas. Y, de hecho, hay una manera más fácil. Calculadoras tienden a tener una línea de muestra. En Swing, que es un JTextField, no un JTextArea. Y, si desea restringir el contenido, utilice un JFormattedTextField, que es una subclase. Así, en lugar de su texto, tendría que utilizar JFormattedTextField de pantalla = new JFormattedTextField(0). Cuando usted necesita para cambiar el valor, que se llama setValue con un entero en él. Esto hace internamente lo que me sugiere el Documento.
    • Podría tal vez agregar algo sobre los bucles for y la iteración, incluso si es sólo un enlace? El botón de creación de código es sólo… estremecimiento
    • Hecho. Pero, realmente necesitas para aprender Java fundamentos primero. La mejor calculadora de ejercicios que yo sepa, en realidad, viene de Apple y se describe cómo utilizar XCode e Interface Builder y Objective-C para crear una calculadora. No sé si usted tiene el deseo de aprender todo eso, pero si lo hiciera, se le dará una base sólida.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein