Shayan Akbari
Shayan Akbari

Reputation: 15

ActionListener for one of the Jbuttons doesn't get called

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;



@SuppressWarnings("serial")
public class Gui extends JFrame {

private ExpPanel panel1;
private Expression expression;
private ColorPanel panel2;
private SetValsPanel panel3;
int xIndex;
int cIndex;

public Gui(){
    setLayout(new GridLayout(3,1,0,0));
    panel1 = new ExpPanel();
    panel2 = new ColorPanel();
    panel3 = new SetValsPanel();

    add(panel1);
    add(panel2);
    add(panel3);

    panel1.setExp.addActionListener(
            new ActionListener() {

                public void actionPerformed(ActionEvent arg0) {
                    String temp = panel1.setExp.getText();
                    expression = new Expression(temp);
                    boolean[] isValid = expression.checkValid();
                    if(isValid[0]){
                        panel1.setExp.setText(expression.getExpression());
                        panel1.valid.setText("");
                        getContentPane().remove(panel2);
                        getContentPane().remove(panel3);
                        if (expression.getVars().length==0)
                            panel1.valid.setText("There's no variables in the entered expression.");
                        else if(expression.getVars().length==1){
                            panel3 = new SetValsPanel(expression);
                            add(panel3);

                        }
                        else {
                        panel2 = new ColorPanel(expression);
                        add(panel2);

                    }
                    }
                    else {


                        if(!isValid[1])
                            panel1.valid.setText("Invalid Expression (The prantheses don't match). Re-enter the expression." );

                        if(!isValid[3])
                            panel1.valid.setText("Invalid Expression (The expression must not continue after the last pranthes OR Invalid function name). Re-enter the expression." );

                        if(!isValid[2])
                            panel1.valid.setText("Invalid Expression (At least one argument of one of the functions is not entered). Re-enter the expression." );

                        if(!isValid[4])
                            panel1.valid.setText("Invalid Expression (You've entered two arguments for a single argument function). Re-enter the expression." );

                        getContentPane().remove(panel2);
                        getContentPane().remove(panel3);

                    }
                    validate();
                    repaint();
                }
            }
            );

    panel1.setbtn.addActionListener(
            new ActionListener() {

                public void actionPerformed(ActionEvent arg0) {
                    System.out.println("in this shit");
                    String temp = panel1.setExp.getText();
                    expression = new Expression(temp);
                    boolean[] isValid = expression.checkValid();
                    if(isValid[0]){
                        panel1.setExp.setText(expression.getExpression());
                        panel1.valid.setText("");
                        getContentPane().remove(panel2);
                        getContentPane().remove(panel3);
                        if (expression.getVars().length==0)
                            panel1.valid.setText("There's no variables in the entered expression.");
                        else if(expression.getVars().length==1){
                            panel3 = new SetValsPanel(expression);
                            add(panel3);

                        }
                        else {
                        panel2 = new ColorPanel(expression);
                        add(panel2);

                    }
                    }
                    else {


                        if(!isValid[1])
                            panel1.valid.setText("Invalid Expression (The prantheses don't match or don't exist). Re-enter the expression." );

                        if(!isValid[3])
                            panel1.valid.setText("Invalid Expression (The expression must not continue after the last pranthes OR Invalid function name). Re-enter the expression." );

                        if(!isValid[2])
                            panel1.valid.setText("Invalid Expression (At least one argument of one of the functions is not entered). Re-enter the expression." );

                        if(!isValid[4])
                            panel1.valid.setText("Invalid Expression (You've entered two arguments for a single argument function). Re-enter the expression." );

                        getContentPane().remove(panel2);
                        getContentPane().remove(panel3);

                    }
                    validate();
                    repaint();
                }
            }
            );

    panel2.setbtn.addActionListener(
            new ActionListener() {


                public void actionPerformed(ActionEvent arg1) {
                    if (panel2.cIndex == panel2.xIndex)
                        JOptionPane.showMessageDialog(null, "You can't choose the same variable for x-axis and color", "Error!", JOptionPane.ERROR_MESSAGE);
                    else {
                        String temp;
                        temp = expression.getVars()[xIndex];
                        expression.setVars(xIndex,expression.getVars()[0]);
                        expression.setVars(0,temp);
                        temp = expression.getVars()[cIndex];
                        expression.setVars(xIndex,expression.getVars()[1]);
                        expression.setVars(1,temp);
                        temp = null;
                        getContentPane().remove(panel3);
                        panel3 = new SetValsPanel(expression);
                        add(panel3);
                        validate();
                        repaint();
                    }
                }
            }
            );

}



}


@SuppressWarnings("serial")
class ExpPanel extends JPanel{

String expression;
JTextField setExp;
JButton setbtn;
JLabel instruction;
JLabel valid;
boolean isValid;
public ExpPanel(){

    setLayout(new GridLayout(2, 1, 5, 5));
    setExp = new JTextField(10);
    setbtn = new JButton("Set");    
    instruction = new JLabel("Enter Expression : ");
    valid = new JLabel("", JLabel.CENTER);

    JPanel up = new JPanel();
    up.add(instruction,BorderLayout.WEST);
    up.add(setExp,BorderLayout.CENTER);
    up.add(setbtn,BorderLayout.EAST);

    add(up);
    add(valid);

}



 }

@SuppressWarnings("serial")
class ColorPanel extends JPanel{

JButton setbtn = new JButton("Set");
JRadioButton[] xAxisbtns;
JRadioButton[] colorbtns;
int xIndex= -1;
int cIndex = -1;
public ColorPanel(){

}

public ColorPanel(Expression a){
    int num = a.getVars().length;
    xAxisbtns = new JRadioButton[num];
    colorbtns = new JRadioButton[num];
    ButtonGroup colorgroup = new ButtonGroup();
    ButtonGroup axisgroup= new ButtonGroup();
    setLayout( new GridLayout(4,1,0,0));
    JLabel instr = new JLabel("Select the variables for x-Axis and Color : ",JLabel.CENTER);
    JPanel cPanel = new JPanel();
    JPanel xPanel = new JPanel();
    cPanel.setLayout(new GridLayout(1, num + 1, 1, 1));
    xPanel.setLayout(new GridLayout(1, num + 1, 1, 1));
    cPanel.add(new JLabel("Select the variable for Color :",JLabel.CENTER));
    xPanel.add(new JLabel("Select the variable for x-Axis :",JLabel.CENTER));
    for(int i =0;i<num;i++){
        xAxisbtns[i] = new JRadioButton(a.getVars()[i]);    
        colorbtns[i] = new JRadioButton(a.getVars()[i]);
        colorgroup.add(colorbtns[i]);
        axisgroup.add(xAxisbtns[i]);
        xPanel.add(xAxisbtns[i]);
        cPanel.add(colorbtns[i]);
        xAxisbtns[i].addItemListener(new xhandler(i));
        colorbtns[i].addItemListener(new chandler(i));
    }
    JPanel btnPanel = new JPanel();
    btnPanel.add(setbtn,JPanel.LEFT_ALIGNMENT);
    add(instr);
    add(xPanel);
    add(cPanel);
    add(btnPanel);
}

  private class xhandler implements ItemListener{
    private int index;

    @Override
    public void itemStateChanged(ItemEvent arg0) {

        xIndex = index;
    }
    public xhandler(int i){
        index = i;
    }

}

  private class chandler implements ItemListener{
    private int index;

    @Override
    public void itemStateChanged(ItemEvent arg0) {

        cIndex = index;
    }
    public chandler(int i){
        index = i;
    }

 }
 }
@SuppressWarnings("serial")
class SetValsPanel extends JPanel{

 JTextField[][] vals;
 JButton drawIt = new JButton("Draw this shit");
 JLabel[][] labels;

 public SetValsPanel(){

    drawIt.setEnabled(false);

}

public SetValsPanel(Expression a){

    int num = a.getVars().length;
    vals = new JTextField[3][num];
    labels = new JLabel[3][num];
    JPanel[] rows = new JPanel[num];
    setLayout(new GridLayout(num+2,1,5,5));
    add(new JLabel("Set the Range and the inital value for each variable : "));
    for(int i=0;i<num;i++){
        labels[0][i] = new JLabel("Range for " + a.getVars()[i] + " :",JLabel.CENTER);
        labels[1][i] = new JLabel(" to ",JLabel.CENTER);
        labels[2][i] = new JLabel(" Inital value = " + a.getVars()[i] + " :",JLabel.CENTER);
        vals[0][i] = new JTextField(3);
        vals[1][i] = new JTextField(3);
        vals[2][i] = new JTextField(3);
        rows[i] = new JPanel();
        rows[i].setLayout(new GridLayout(1, 6, 2, 2));
        rows[i].add(labels[0][i]);
        rows[i].add(vals[0][i]);
        rows[i].add(labels[1][i]);
        rows[i].add(vals[1][i]);
        if (i!=0) {
            rows[i].add(labels[2][i]);
            rows[i].add(vals[2][i]);
        }
        add(rows[i]);
    }

    add(drawIt);

}

}

The Action listener for the second button does not work, while the first actionlistener works perfectly. I've tried to check whether it gets called or not by adding a system.out to actionPerformed method which showed me the actionlistener does not even get called when I click on the button.

Edit = panel2.setbtn.addActionListener this is the one that doesn't work.

Edit = here's the expression class

public class Expression {

private String expression;
protected String[] vars;
private String[] varValues;

public Expression(String expression){

    this.expression = ExpressionFunctions.toValid(expression);


    vars = new String[0];
    varValues = new String[0];

    extractVars();
}

public void extractVars() {

    String temp = expression;
    temp = temp.toLowerCase();

    String[] names1 = {"div\\(" , "idiv\\(" , "mod\\(" , "pow\\("};
    String[] names2 = {"cotan\\(" , "arccos\\(" , "arccosh\\(" , "arcsinh\\(" , "cos\\(", "arccot\\(" , "arccoth\\(" , 
            "arcsin\\(" , "arcsinh\\(" , "arccosh\\(", "arctanh\\(" , "cosh\\(" , "exp\\(" , "ln\\(", "fact\\(" , 
            "fib\\(" , "sinh\\(" , "tanh\\(" };
    for(String x : names1)
        temp = temp.replaceAll(x, "add\\(");
    for(String x : names2)
        temp = temp.replaceAll(x, "sin\\(");

    EvalExperession a = new EvalExperession(temp, vars, varValues);
    boolean rep = true;


    while (rep) {
        try {
            a.run();
            rep = false;
        } catch (IllegalArgumentException e) {

            add(e.getMessage());

         a = new EvalExperession(temp, vars, varValues);

        }
    }



}

private void add(String message) {
    String[] temp1 = new String[vars.length];
    String[] temp2 = new String[vars.length];
    for(int i =0;i<vars.length;i++){
        temp1[i] = vars[i];
        temp2[i] = varValues[i];
}
    vars = new String[temp1.length+1];
    varValues = new String[temp2.length+1];
    for(int i =0;i<temp1.length;i++){
        varValues[i] = temp2[i];

        vars[i] = temp1[i];}
    vars[temp1.length] = message;
    varValues[temp1.length] = "1.0";

    temp1=null;
    temp2 = null;
}

public String getExpression() {
    return expression.toLowerCase();
}

public void setExpression(String expression) {
    this.expression = expression;
}

public String[] getVars() {
    return vars;
}

public void setVars(int i,String a) {
    this.vars[i] = a;
}

public String[] getVarValues() {
    return varValues;
}

public void setVarValues(String[] varValues) {
    this.varValues = varValues;
}

public boolean[] checkValid(){

    int right=0;
    int left=0;

    boolean[] res = new boolean[5];
    for (int i =0;i<5;i++)
        res[i] = true;



    for (int i=0; i<expression.length(); i++){



        if(expression.charAt(i) == '(')
            left++;
        if(expression.charAt(i) == ')')
            right++;
        if (right>left){
            res[0] = false;
            res[1] = false;
            return res;}
    }

    if (right!=left || (right == 0 && left == 0))
    {
        res[0] = false;
        res[1] = false;
        return res;}

    for (String x : vars){
        if((x + "a").equals("a") || x.indexOf("(")!= -1 || x.indexOf(",")!= -1 || x.indexOf(")")!= -1){
            if((x + "a").equals("a")){
                res[0] = false;
                res[2] = false;
                return res;
            }

            if(x.indexOf("(")!= -1 || x.indexOf(")")!= -1 ){

                res[0] = false;
                res[3] = false;
                return res;
            }

            if(x.indexOf(",")!= -1){
                res[0] = false;
                res[4] = false;
                return res;
            }

        }

    }

    return res;

}


}

toValid function simply corrects a string, you can ignore it.

Upvotes: 0

Views: 751

Answers (3)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285405

Suggestions:

  • You will want to read up on and use the CardLayout which will allow you to easily swap JPanels or any other component and would help simplify your program.
  • You probably don't want to create and swap several SetValPanels, and same for ColorPanel. I'm betting that you just want to create one of each and swap them when needed. Sure pass in a new Expression object into the panels if needed, but avoid creating and discarding if not needed. That would help simplify your code and avoid your ActionListener problem.
  • Avoid having one class directly manipulate the fields of other classes, such as your code where you have one class directly add an ActionListener to a JButton held by another class, as this increases connections/coupling. Instead, make your fields private, and if you plan on allowing other classes to add listeners to a contained component, give the class a public method for this purpose. For example public void addSetBtnActionListener(ActionListener listener) {...}
  • Also read up on MVC, the Model-View-Control design pattern as that would help you to reduce your code's complexity.

Upvotes: 2

Phil Freihofner
Phil Freihofner

Reputation: 7910

Here's what I think is happening. At the start, you create a ColorPanel, using ColorPanel() and add an ActionListener to its setbtn.

Then, after the expression is entered in the top panel and its button is pressed, a new ColorPanel is made using ColorPanel(string). However, the new setbtn in the new ColorPanel is not given an ActionListener.

Possible quickie solution: add a Button parameter to the constructor and pass the old setbtn to the new instance. That would be quick and dirty.

panel2 = new ColorPanel(expression, panel2.setbtn);

in the calls to new panel2, and

public ColorPanel(Expression a, JButton setbtn){
    this.setbtn = setbtn;

in ColorPanel. This worked for me.

Upvotes: 2

Jean-Fran&#231;ois Savard
Jean-Fran&#231;ois Savard

Reputation: 21004

You never add any listener to the drawIt button. Do the same you did for the setbtn button. The compiler won't guess by itself that it need to add a listener...

You probably want to add

SetValsPanel.drawIt.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
    ...
    }
}

Upvotes: 2

Related Questions