mark anthony
mark anthony

Reputation: 3

how to make JTextField change other boxed based off input

i am trying to write a code where you have three fields pop up, and it will multiply the first two inputs and auto-update the third field and change the value and the text property of the last field while you enter the values into the first fields?

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

public class Solver implements ActionListener {

    void actionPerformed(ActionEvent E){



        JTextField xField = new JTextField(5);
        JTextField yField = new JTextField(5);
        JTextField zField = new JTextField(5);

        JPanel myPanel = new JPanel();
        myPanel.add(new JLabel("x:"));
        myPanel.add(xField);
        myPanel.add(Box.createHorizontalStrut(15));
        myPanel.add(new JLabel("y:"));
        myPanel.add(yField);
        myPanel.add(Box.createHorizontalStrut(15));
        myPanel.add(new JLabel("z:"));
        myPanel.add(zField);

        int result = JOptionPane.showConfirmDialog(null, myPanel,
            "please enter X and Y value", JOptionPane.OK_CANCEL_OPTION);
        double x = Double.parseDouble(xField.getText());
        double y = Double.parseDouble(yField.getText());
        if(result == JOptionPane.OK_OPTION) {
            System.out.println(x+10.0);
            System.out.println(y + 10);

        }
    }
}

right now i have it printing both initial values added by 10 just to be sure they are set to doubles, but if someone could help me to make the zField change to whatever arithmetic that would be appreciated(and if someone can get rid of the error with the actionPerformed conflicting with ActionLister that would be greatly appreciated as well.)

Upvotes: 0

Views: 1128

Answers (3)

Jonas Obara
Jonas Obara

Reputation: 1

What you need is a key listener. Check out this java tutorial https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

Upvotes: 0

Xiang Yu
Xiang Yu

Reputation: 1

import javax.swing.*;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JTquestion {

    public static class Solver extends JFrame {
       public Solver(){

            setTitle("please enter X and Y value");
            GridBagConstraints c = new GridBagConstraints();
            c.insets = new Insets(10,10,10,10);

            JTextField xField = new JTextField(5);
            JTextField yField = new JTextField(5);
            JTextField zField = new JTextField(5);
            JButton ok = new JButton("ok");

            JPanel myPanel = new JPanel(new GridBagLayout());
            myPanel.add(new JLabel("x:"));
            myPanel.add(xField,c);
            myPanel.add(new JLabel("y:"));
            myPanel.add(yField,c);
            myPanel.add(new JLabel("z:"));
            myPanel.add(zField,c);

            c.gridy = 1;

            ok.addActionListener(new ActionListener(){

                @Override
                public void actionPerformed(ActionEvent arg0) {
                    double x = Double.parseDouble(xField.getText());
                    double y = Double.parseDouble(yField.getText());

                    xField.setText(Double.toString(x));
                    xField.setText(Double.toString(y));

                    zField.setText(Double.toString(x*y));
                }

            });

            c.gridx = 3;
            c.gridy = 2;
            c.insets = new Insets(10,0,10,10);
            c.fill = GridBagConstraints.HORIZONTAL;
            myPanel.add(ok, c);
            add(myPanel);
            setVisible(true);
            pack();
            this.setSize(330, 150);
            this.setResizable(false);

        }
    }

    public static void main(String[] args){
        Solver s = new Solver();
    }
}

Upvotes: 0

MadProgrammer
MadProgrammer

Reputation: 347314

You could...

Attach one or more ActionListeners to the JTextFields you are displaying and perform the required arithmetic when it's actionPerformed method is called.

The problem with this is, the user is then expected to press the "action" key (typically Enter) to trigger the ActionListener

See How to write an action listener for more details.

You could...

Use a FocusListener and monitor for focusLost events on the text fields and perform the required arithmetic when focus is lost.

The problem with this is the user needs to leave the last field before the focusLost event is triggered and it's not immediately obvious

See How to write a focus listener for more details

You could...

Use a DocumentListener which would notify you in real time as the fields are updated.

You could then perform the required arithmetic operations once you've established that both fields are in a valid state (ie not empty and contain appropriate numbers)

See How to write a Document Listener for more details

After thoughts...

Regardless of which direction you might choose, I'd personally create a single, custom class which implemented the required interface and which required a reference to each of the fields. This way it would be able to perform the required operations and update the required fields independenlty

Upvotes: 2

Related Questions