1. Activación inmediata. Adquiere ahora tu membresía, clic aquí.

No puedo modificar el JTextField.

Publicado en 'Programación' por Chanox, 12 Jun 2018.





  1. Chanox

    Chanox Miembro maestro

    Registro:
    16 Mar 2015
    Mensajes:
    255
    Likes:
    6
    Temas:
    67




    Estaba probando algunas cosas.. y bueno, tratando de hacer por cuenta propia una calculadora simple pero no me permite cambiar el texto del JTextField al presionar un boton.

    Código:
    public class Frame extends JFrame{
        
        public Frame(){
            setTitle("Calculadora...");
            setSize(400, 400);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            
            add(new PanelResultado(), BorderLayout.NORTH);
            add(new PanelOperaciones(), BorderLayout.CENTER);
            
            setVisible(true);
        }
        
    }
    
    class PanelResultado extends JPanel{
        private JTextField res = null;
    
        public PanelResultado() {
            setLayout(new BorderLayout());
            
            res = new JTextField("0");
            res.setFont(new Font("Arial", Font.PLAIN, 16));
            res.setBackground(Color.BLACK);
            res.setForeground(Color.WHITE);
            res.setPreferredSize(new Dimension(400, 50));
            res.setHorizontalAlignment(JTextField.RIGHT);
            res.setEditable(false);
            add(res);
        }
    
        public JTextField getRes() {
            return res;
        }
    
        public void setRes(JTextField res) {
            this.res = res;
        }
        
    }
    
    class PanelOperaciones extends JPanel{
        
        private JButton b1 = null;
        private PanelResultado panel;
        
        public PanelOperaciones() {
            setLayout(new GridLayout(4, 4));
            
            agregarBoton("9");
            agregarBoton("8");
            agregarBoton("7");
            agregarBoton("( / )");
            
            agregarBoton("6");
            agregarBoton("5");
            agregarBoton("4");
            agregarBoton("( * )");
            
            agregarBoton("3");
            agregarBoton("2");
            agregarBoton("1");
            agregarBoton("( + )");
            
            agregarBoton("0");
            agregarBoton("Limpiar");
            agregarBoton("( = )");
            agregarBoton("( - )");
            
            panel = new PanelResultado();
        }
        
        private void agregarBoton(String n) {
            b1 = new JButton(n);
            b1.setBackground(Color.BLACK);
            b1.setForeground(Color.WHITE);
            b1.setFont(new Font("Arial",Font.PLAIN, 15));
            
            add(b1);
            
            ejecutar();
        }
        
        void ejecutar() {
            
            
            ActionListener oyente = new ActionListener() {
        
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    
                    panel.getRes().setText(" asdadasa");
                    
                }
            };
            
            b1.addActionListener(oyente);
            
        }
        
        
    }

    En el metodo ejecutar casi al final intento cambiar los datos del JTextField y nada.. tb, intente crear un metodo donde cambiaba su texto en la clase donde está el JTextField , para asi acceder a este metodo desde la siguiente clase donde estan los botones pero tampoco cambia..
     


  2. gnox

    gnox Miembro de bronce

    Registro:
    3 Ene 2013
    Mensajes:
    1,893
    Likes:
    748
    Temas:
    67
    Código:
     public void setRes(string texto) {
           this.res.setText(texto);
       }
    
    Código:
    public void actionPerformed(ActionEvent arg0) {
                   panel.setRes(" asdadasa");
               }
    
     
  3. Chanox

    Chanox Miembro maestro

    Registro:
    16 Mar 2015
    Mensajes:
    255
    Likes:
    6
    Temas:
    67
    Hola, sí, eso también ya lo había probado (olvide decirlo) pero igual no funciona.. :(
     
  4. gnox

    gnox Miembro de bronce

    Registro:
    3 Ene 2013
    Mensajes:
    1,893
    Likes:
    748
    Temas:
    67
    Porque :
    - En la clase Frame estas creando una instancia de PanelResultado, la que ves con el 0
    Código:
    add(new PanelResultado()
    
    - En la clase PanelOperaciones estas creando otra instancia
    Código:
    panel = new PanelResultado();
    
    La cual no la agregas al JPanel por lo que no se ve y es a la cual le estas cambiando el texto.
     
  5. Chanox

    Chanox Miembro maestro

    Registro:
    16 Mar 2015
    Mensajes:
    255
    Likes:
    6
    Temas:
    67
    Exacto.. jaja, ya arregle el problema haciendo estatico el metodo que devuelve al JTextField, para así usarlo en la otra clase. Qué otras opciones para arreglar el problema existen?? Gracias.
     
  6. gnox

    gnox Miembro de bronce

    Registro:
    3 Ene 2013
    Mensajes:
    1,893
    Likes:
    748
    Temas:
    67
    Deja a un lado swing/awt y refuerza mas OOP con java puro que estas cometiendo errores por no tenerlo claro.
     
  7. Chanox

    Chanox Miembro maestro

    Registro:
    16 Mar 2015
    Mensajes:
    255
    Likes:
    6
    Temas:
    67
    Por q crees q debo repasar poo? a que errores te refieres?
     
  8. josebaperu

    josebaperu Miembro nuevo

    Registro:
    10 Jun 2016
    Mensajes:
    17
    Likes:
    1
    Temas:
    1
    Que tal un poco de refactorizacion? ...
    Código:
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class Frame extends JFrame{
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new Frame();
                }
            });
           
        }
       
        public Frame(){
            setTitle("Calculadora...");
            setSize(400, 400);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            PanelResultado panelResultado = new PanelResultado();
            add(panelResultado, BorderLayout.NORTH);
            add(new PanelOperaciones(panelResultado), BorderLayout.CENTER);
            setVisible(true);
        }
       
    }
    
    class PanelResultado extends JPanel{
        private JTextField resultTextField = null;
    
        public PanelResultado() {
            setLayout(new BorderLayout());
           
            resultTextField = new JTextField();
            resultTextField.setFont(new Font("Arial", Font.PLAIN, 16));
            resultTextField.setBackground(Color.BLACK);
            resultTextField.setForeground(Color.WHITE);
            resultTextField.setPreferredSize(new Dimension(400, 50));
            resultTextField.setHorizontalAlignment(JTextField.RIGHT);
            resultTextField.setEditable(false);
            add(resultTextField);
        }
    
        public JTextField getResultTextField() {
            return resultTextField;
        }
    
        public void setResultTextField(JTextField res) {
            this.resultTextField = res;
        }
       
    }
    
    class PanelOperaciones extends JPanel{
       
        private PanelResultado panelResultado;
        private String existingText ;
        ScriptEngineManager mgr;
        ScriptEngine engine;
        public PanelOperaciones(PanelResultado pr) {
            panelResultado = pr;
            mgr = new ScriptEngineManager();
            engine = mgr.getEngineByName("JavaScript");
            setLayout(new GridLayout(4, 4));
            String[] buttonText = {"9","8","7","/","6","5","4","*","3","2","1","+","0","Limpiar","=","-"};
           
            for(String str : buttonText)
                agregarBoton(str);
        }
       
        private void agregarBoton(String n) {
            JButton button = new JButton(n);
            button.setBackground(Color.BLACK);
            button.setForeground(Color.WHITE);
            button.setFont(new Font("Arial",Font.PLAIN, 15));
            button.setFocusPainted(false);
            button.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent ev) {
                    final String ERROR_MESSAGE = "Expresion Incorrecta";
                    String buttonInput = button.getText();
                    existingText = panelResultado.getResultTextField().getText();
                    if(existingText.equals(ERROR_MESSAGE))
                        clearInput();
    
                    if(buttonInput.equals("Limpiar")) {
                        clearInput();
                       
                    }else if(buttonInput.equals("=")){
                        try {
                            renderText(stringToMath(existingText));
                        }catch (Exception e) {
                            renderText(ERROR_MESSAGE);
                            e.printStackTrace();
                        }
                    }else {
                        renderText(existingText+buttonInput);   
                    }
                }
    
                private String stringToMath(String str) throws ScriptException {
                    return engine.eval(str).toString();
                }
    
                private void renderText(String str) {
                    panelResultado.getResultTextField().setText(str);
                }
    
                private void clearInput() {
                        panelResultado.getResultTextField().setText("");
                        existingText = "";
                }
               
            });
            add(button);
        }
    }