Russel Go
Russel Go

Reputation: 37

Inputting numbers in a textfield via button on GUI

I've made a simple calculator

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Calculator extends JFrame implements ActionListener
{
GridLayout layout = new GridLayout(5, 1);
JLabel l1 = new JLabel("Number 1:");
JLabel l2 = new JLabel("Number 2:");
JLabel l3 = new JLabel("Answer:"); 
JTextField t1 = new JTextField(30);
JTextField t2 = new JTextField(30);
JTextField t3 = new JTextField(30);
JButton add = new JButton("+");
JButton sub = new JButton("-");
JButton mul = new JButton("*");
JButton div= new JButton("/");
Float ans; 

public Calculator()
  {
    super("Calculator");
    setSize(250, 200);
    add(l1);
    add(t1);
    add(l2);
    add(t2);
    add(l3);
    add(t3);
    add(add);
    add(sub);
    add(mul);
    add(div);
    setLayout(layout);
    add.addActionListener(this);
    sub.addActionListener(this);
    mul.addActionListener(this);
    div.addActionListener(this);
    setVisible(true);
  }

public void actionPerformed(ActionEvent e)
  {
String n1 = t1.getText();
String n2 = t2.getText();
Float num1 = Float.parseFloat(n1);
Float num2 = Float.parseFloat(n2);   
Object clicked = e.getSource();

if(add == clicked)
{
  t3.setText(String.valueOf(num1+num2));
}

else if(sub == clicked)
{
  t3.setText(String.valueOf(num1-num2));
}

else if(mul == clicked)
{
  t3.setText(String.valueOf(num1*num2));
}

else
{
if(num2 == 0)
t3.setText("Can't Divide By Zero");
else
t3.setText(String.valueOf(num1/num2));
  }
 }
}

And a class to read it

public class UseMyFrame
{
  public static void main(String[] args)
  {
    Calculator calc = new Calculator();
    calc.setVisible(true);
  }
}

My problem is I want to add another feature and put 9 buttons 1-9 that when pressed will place their respective numbers on the textfield, but I don't know how to set them to appear at the textfield, I first wanna do set.text but i realized how will the button know where to put its number because if I do set.text i need to either put it on textfield1 or textfield 2. I wanna make the number appear in textfield1 first then on textfield2 if there is already a number on textfield1

Upvotes: 1

Views: 8010

Answers (4)

ahmed reda
ahmed reda

Reputation: 153

first set global int curs = 0 and global string screen then at each numeric button put that code (all about concatenation of strings )

if(curs==0){
    screen="1";  // change the number for each button
    jTextField1.setText(screen);
    a=Double.parseDouble(screen);
    curs++;
    }else{
    screen=screen+"1";  //  // change the number for each button
    jTextField1.setText(screen);
    a=Double.parseDouble(screen);
    curs++;
    }

Upvotes: 1

camickr
camickr

Reputation: 324197

but I don't know how to set them to appear at the textfield

The Action you add to your JButton should extend TextAction. The TextAction has access to the last focused text component (so you don't have to keep track of this information yourself). Your code would be something like:

public class AddDigitAction extends TextAction
{
    public void actionPerformed(ActionEvent e)
    {
        JButton button = (JButton)e.getSource();
        String digit = button.getActionCommand();
        JTextComponent target = getTextComponent(e);
        target.replaceSelection(digit);
}

You can use the same Action for all your buttons. The replaceSelection() method is an easy way to add text to the textfield. It will insert text at the last location of the caret in the text field.

Upvotes: 2

D.R.
D.R.

Reputation: 21224

If you only want to have single digits:

if(t1.getText().length() == 0)
    t1.setText(...);
else
    t2.setText(...);

Better: Find out which textfield has the current focus (see javadocs) and put the digit at the end of that text:

tFocused.setText(tFocused.getText() + digit)

Upvotes: 1

Vincent Ramdhanie
Vincent Ramdhanie

Reputation: 103145

So you need to create a boolean variable that will help you keep track of which field to put the number in. Then in the action of the button you can use that to decide.

   if(first){
      textField1.setText("1");
      first = false;
   }else{
      textField2.setText("1");
      first = true;
   }

Now, this snippet is very simple and does not consider all the possibilities. It simply toggles between the two fields. You can extend it to what you need.

Upvotes: 1

Related Questions