Jensen Kansas
Jensen Kansas

Reputation: 1

JAVA UI ActionListener 2 consecutive click of buttons with if else statements

Can someone please tell me what's wrong with my code?

I'm trying to make a UI that has bin, dec, so on.. and every time it's clicked only appropriate numbers corresponding the number system can be clicked by the user or is displayed in the textField, like if the user clicks bin only 0 and 1 can be displayed on the textField.

I tried to use nested if else statements but it don't seem to work. Please help thank you.

Here is my code below:

    import java.awt.BorderLayout;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.SwingConstants;  
    import javax.swing.*;
    import java.awt.*;
    import java.awt.FlowLayout;


public class Trial extends JFrame implements ActionListener
{

private JTextField textField;
private JButton n1, n2, n3, n4, n5, n6, n7, n8, n9, n0, add, subtract, multiply, divide, clear, backspace, bin, dec, oct, hex;
private JPanel panel, panel1, p;


public Trial(String str)
{

    super(str);
    setSize(300, 200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setResizable(false);


    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(5, 4));

    panel.add(n1 = new JButton("1"));
    panel.add(n2 = new JButton("2"));
    panel.add(n3 = new JButton("3"));
    panel.add(backspace = new JButton("C"));
    panel.add(n4 = new JButton("4"));
    panel.add(n5 = new JButton("5"));
    panel.add(n6 = new JButton("6"));
    panel.add(bin = new JButton("BIN"));
    panel.add(n7 = new JButton("7"));
    panel.add(n8 = new JButton("8"));
    panel.add(n9 = new JButton("9"));
    panel.add(dec = new JButton("DEC"));
    panel.add(add = new JButton("+"));
    panel.add(n0 = new JButton("0"));
    panel.add(subtract = new JButton("-"));
    panel.add(oct = new JButton("OCT"));
    panel.add(multiply = new JButton("*"));
    panel.add(clear = new JButton("AC"));
    panel.add(divide = new JButton("/"));
    panel.add(hex = new JButton("HEX"));



    JPanel panel1 = new JPanel();
    panel1.setLayout(new FlowLayout());
    panel1.add(textField = new JTextField(20));


    panel.setBounds(20,20,300,150);
    panel1.setBounds(0,0,300,20);
    add(panel, BorderLayout.SOUTH);
    add(panel1, BorderLayout.NORTH);


    n1.addActionListener(this);
    n2.addActionListener(this);
    n3.addActionListener(this);
    n4.addActionListener(this);
    n5.addActionListener(this);
    n6.addActionListener(this);
    n7.addActionListener(this);
    n8.addActionListener(this);
    n9.addActionListener(this);
    n0.addActionListener(this);
    add.addActionListener(this);
    subtract.addActionListener(this);
    multiply.addActionListener(this);
    divide.addActionListener(this);
    clear.addActionListener(this);
    backspace.addActionListener(this);
    bin.addActionListener(this);
    dec.addActionListener(this);
    oct.addActionListener(this);
    hex.addActionListener(this);


    setVisible(true);

}

public void actionPerformed(ActionEvent event)
{
    if(event.getSource() == bin){
        if(event.getSource() == n1){
            textField.setText(textField.getText() + "1");
        }
        else if(event.getSource() == n0){
            textField.setText(textField.getText() + "0");
        }
        else if(event.getSource() == add){
            textField.setText(textField.getText() + " + ");
        }
        else if(event.getSource() == subtract){
            textField.setText(textField.getText() + " - ");
        }
        else if(event.getSource() == multiply){
            textField.setText(textField.getText() + " * ");
        }
        else if(event.getSource() == divide){
            textField.setText(textField.getText() + " / ");
        }
        else if(event.getSource() == clear){
            textField.setText("");
        }
        else{
            textField.setText("");
        }
    }

    else if(event.getSource() == dec){
        if(event.getSource() == n1){
            textField.setText(textField.getText() + "1");
        }
        else if(event.getSource() == n2){
            textField.setText(textField.getText() + "2");
        }
        else if(event.getSource() == n3){
            textField.setText(textField.getText() + "3");
        }
        else if(event.getSource() == n4){
            textField.setText(textField.getText() + "4");
        }
        else if(event.getSource() == n5){
            textField.setText(textField.getText() + "5");
        }
        else if(event.getSource() == n6){
            textField.setText(textField.getText() + "6");
        }
        else if(event.getSource() == n7){
            textField.setText(textField.getText() + "7");
        }
        else if(event.getSource() == n8){
            textField.setText(textField.getText() + "8");
        }
        else if(event.getSource() == n9){
            textField.setText(textField.getText() + "9");
        }
        else if(event.getSource() == n0){
            textField.setText(textField.getText() + "0");
        }
        else if(event.getSource() == add){
            textField.setText(textField.getText() + " + ");
        }
        else if(event.getSource() == subtract){
            textField.setText(textField.getText() + " - ");
        }
        else if(event.getSource() == multiply){
            textField.setText(textField.getText() + " * ");
        }
        else if(event.getSource() == divide){
            textField.setText(textField.getText() + " / ");
        }
        else if(event.getSource() == clear){
            textField.setText("");
        }
    }

}




public static void main(String [] args)
{
    new Trial("Le Frame");
}

}

The problem of the above code is it does not display any character at all in the textfield.

Here below is a snippet of the program: ![1]: (https://i.sstatic.net/R2Len.png)

Upvotes: 0

Views: 512

Answers (3)

Sergiy Medvynskyy
Sergiy Medvynskyy

Reputation: 11327

So, you need a separate variable to hold the current view type (binary/octal/decimal/hexal)

In your code it should looks like:

private static final int BINARY = 2; // probably use enum
private static final int OCTAL = 8; // probably use enum
private static final int DECIMAL = 10; // probably use enum
private JTextField textField;
private JButton n1, n2, n3, n4, n5, n6, n7, n8, n9, n0, add, subtract, multiply, divide, clear, backspace, bin, dec, oct, hex;
private JPanel panel, panel1, p;
private int system = DECIMAL;

// initialization code

public void actionPerformed(ActionEvent event)
{
    if(event.getSource() == bin){
        system = BINARY;
    } else if (event.getSource() == dec) {
        system = DECIMAL;
    } // same for other systems.

    if (system == BINARY) {
        if(event.getSource() == n1){
            textField.setText(textField.getText() + "1");
        }
        else if(event.getSource() == n0){
            textField.setText(textField.getText() + "0");
        }
        else if(event.getSource() == add){
            textField.setText(textField.getText() + " + ");
        }
        else if(event.getSource() == subtract){
            textField.setText(textField.getText() + " - ");
        }
        else if(event.getSource() == multiply){
            textField.setText(textField.getText() + " * ");
        }
        else if(event.getSource() == divide){
            textField.setText(textField.getText() + " / ");
        }
        else if(event.getSource() == clear){
            textField.setText("");
        }
    } else if (system == DECIMAL) {
        if(event.getSource() == n1){
            textField.setText(textField.getText() + "1");
        }
        else if(event.getSource() == n2){
            textField.setText(textField.getText() + "2");
        }
        else if(event.getSource() == n3){
            textField.setText(textField.getText() + "3");
        }
        else if(event.getSource() == n4){
            textField.setText(textField.getText() + "4");
        }
        else if(event.getSource() == n5){
            textField.setText(textField.getText() + "5");
        }
        else if(event.getSource() == n6){
            textField.setText(textField.getText() + "6");
        }
        else if(event.getSource() == n7){
            textField.setText(textField.getText() + "7");
        }
        else if(event.getSource() == n8){
            textField.setText(textField.getText() + "8");
        }
        else if(event.getSource() == n9){
            textField.setText(textField.getText() + "9");
        }
        else if(event.getSource() == n0){
            textField.setText(textField.getText() + "0");
        }
        else if(event.getSource() == add){
            textField.setText(textField.getText() + " + ");
        }
        else if(event.getSource() == subtract){
            textField.setText(textField.getText() + " - ");
        }
        else if(event.getSource() == multiply){
            textField.setText(textField.getText() + " * ");
        }
        else if(event.getSource() == divide){
            textField.setText(textField.getText() + " / ");
        }
        else if(event.getSource() == clear){
            textField.setText("");
        }
    } // same for other systems
}

Please note: it's better to provide separate handler for any button. For example you can do it using lambdas. In this case you don't need a huge if-else-if blocks

Upvotes: 0

NormR
NormR

Reputation: 336

When event.getSource() == bin is true, none of the nested if statements can be true: if(event.getSource() == n1){

Also this if will always be true because the assignment statement pass = 1; if(pass == 1){

Upvotes: 1

saidaspen
saidaspen

Reputation: 690

Try repainting or revalidating after updating:

textField.repaint();

Or possibly:

textField.revalidate();

Check out: https://docs.oracle.com/javase/tutorial/uiswing/painting/problems.html

Upvotes: 0

Related Questions