Pregunta

estoy construyendo un simple modificado Resta-única calculadora donde z = x - y. He creado 3 campos de texto: x, y, y z. La entrada de usuario el valor utilizando el teclado (botones) he diseñado para la x e y.

Con sólo mirar el código de abajo, hay un par de cuestiones de inmediato.

1) El x campo de texto sólo acepta un dígito. (Quiero que acepta hasta 3 dígitos). Cualquier sugerencia sobre cómo puedo modificar la sentencia else if incorporar ese?

2) Cuando he terminado con el campo de texto x, quiero hacerlo con el mismo y con el campo de texto. Sin embargo, los botones están estrictamente asignados a la x campo de texto. Sería ineficaz para hacer uno más sólo para teclado y campo de texto. Entonces, ¿cómo puedo cambiar entre x y campo de texto y. ¿Hay algo de código en la que si el usuario tiene el cursor en el campo de texto x, el teclado está reservada para ese campo de texto X y si el usuario cambia al campo de texto y, el teclado puede ser utilizado para la Y entonces.

3) y una vez los accesos de usuario entran, es una operación simple z = x - y. Que debe ser fácil de implementar. es decir, convertir las cadenas a números enteros, etc., y realizar la diferencia.

Gracias a todos por adelantado!

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

    public class EmbeddedMain extends JFrame
    {
    private JTextField x,y,z;
    private JButton button1, button2, button3, button4, button5, button6, button7, button8, button9, button0, buttonR, buttonE;

        public static void main (String[] args)
            {
            EmbeddedMain em = new EmbeddedMain();
            }

        public EmbeddedMain() //constructor begins, method for embedded main class
        {
            setTitle("Subtraction");
            setSize(450,350);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
            setLayout(new GridLayout(4,5,3,3));
            setVisible(true);   

         button1= new JButton("7");
         button2= new JButton("8");
         button3= new JButton("9");
         button4= new JButton("4");
         button5= new JButton("5");
         button6= new JButton("6");
         button7= new JButton("1");
         button8= new JButton("2");
         button9= new JButton("3");
         button0= new JButton("0");
         buttonR= new JButton("Reset");
         buttonE= new JButton("Enter");

     x = new JTextField("   ");
     y = new JTextField("   ");
     z = new JTextField("   ");
     z.setEditable(false);      

        add(button1);
        add(button2);
        add(button3);
        add(new JLabel("    x:")); 
        add(x); 
        add(button4);
        add(button5);
        add(button6);
        add(new JLabel("    y:")); 
        add(y); 
        add(button7);
        add(button8);
        add(button9);
        add(new JLabel("    z:")); 
        add(z); 
        add(buttonR);
        add(button0);
        add(buttonE);

        thehandler handler = new thehandler();
        button1.addActionListener(handler);
        button2.addActionListener(handler);
        button3.addActionListener(handler); 
        button4.addActionListener(handler);
        button5.addActionListener(handler);
        button6.addActionListener(handler);
        button7.addActionListener(handler);
        button8.addActionListener(handler);
        button9.addActionListener(handler);
        button0.addActionListener(handler);
        buttonR.addActionListener(handler);
        buttonE.addActionListener(handler);

    }

        //building class inside class
        private class thehandler implements ActionListener{

            public void actionPerformed(ActionEvent event){

            if(event.getSource()== button1)
                x.setText("7");
            else if (event.getSource()== button2)
                x.setText("8");
            else if (event.getSource()== button3)
                x.setText("9");
            else if (event.getSource()== button4)
                x.setText("4");
            else if (event.getSource()== button5)
                x.setText("5"); 
            else if (event.getSource()== button6)
                x.setText("6");
            else if (event.getSource()== button7)
                x.setText("1");
            else if (event.getSource()== button8)
                x.setText("2");
            else if (event.getSource()== button9)
                x.setText("3");
            else if (event.getSource()== button0)
                x.setText("0");
            else if (event.getSource()== buttonR)
                x.setText("   ");   
            }
        }

    }
¿Fue útil?

Solución

Se puede añadir un MouseListener a los campos de texto, para saber cuándo el usuario ha cambiado de X a Y y viceversa:

private JTextField selected;

selected = x;
    x.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            selected = x;
        }
    });
    y.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            selected = y;
        }
    });

Para hacer la resta, convertir el texto presente en x e y para ints y restar. Puede refactorizar su actionPerformed a:

    public void actionPerformed(ActionEvent event) {

        String s = selected.getText();
        if (event.getSource() == buttonR) {
            x.setText("");
            y.setText("");
            z.setText("");
        } else if (event.getSource() == buttonE) {
            int result = Integer.parseInt(x.getText()) - Integer.parseInt(y.getText());
            z.setText(String.valueOf(result));
        } else {
            String command = event.getActionCommand();
            selected.setText(s + command);
        }
    }

Otros consejos

Esto parece tarea para que no voy a dar detalles, de todos modos

  1. en lugar de que el uso setText primero debe getText y luego concatenar la ya presente número con el nuevo dígito
  2. se podría utilizar una variable al principio de su actionPerformed y cambiar entre dos campos de texto con un valor booleano, por ejemplo. P.ej. JTextField cur = first ? x : y
  3. acaba de leer la documentación de Integer o String clases y encontrará lo que necesita (toString, valueOf, parse)

Por la forma en que se respondió también ayer y se sugiere no utilizar una cadena de else if / para cada botón ya que usted sabe que es el número que se muestra .. ejemplo:

((JButton)e.getSource()).getText() == "1"

Esto significa que usted está perdiendo una gran cantidad de líneas de código ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top