Search code examples
javatimerplotevent-handlingjslider

Graph plotter with timer in java


I'm working on a grapher that gets an expression like x^2 + t from the user and then will ask the user for range of x and t . t in here is the timer variable. so in x^2 + t the user for example will choose the -10 to 10 for x and 1 to 5 for t . now by clicking the draw button in GUI program the code will start plotting the expression from minimum t (1 in here) and after each second(or any time period) will increase the t value by one and draw the expression with new t (2 ,3 until it reaches the maximum range). how can make the event handler to do this? I have found a way to draw multiple graphs but I can't make a delay so the minimum to maximum . I know I should use timer but I don't know how to use in this part of the code

the Link for the whole code

this is the part of code in plotter class that should be changed :

// Grapher
    drawButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            try {

                String testSpring = null;
                String tVarString = null;

                for (int i = 0; i < 5; i++) {

                    testSpring = inputExpression;
                    tVarString = String.valueOf(i);
                    testSpring = testSpring.replaceAll("t", tVarString);

                    Equation equation = new Equation(testSpring);

                    graph.addEquation(equation);

                }
            }

            catch (EquationSyntaxException e) {

                e.printStackTrace();
            }

        }
    });

This is the picture of the program :

enter image description here

my priority is to make the program run just by clicking draw button but It would be better if this timer could be influence JSlider so the min and max of t would be min and max of Jslider and by clicking draw it would start drawing by every time slider knob would point at a value for t


Solution

  • Take a look at How to use Swing Timers

    This will allow you to setup a callback at a regular interval, which is executed from within the context of the EDT, making it safe to update the UI from within

        public void actionPerformed(ActionEvent arg0) {
    
            Timer timer = new Timer(1000, new ActionListener() {
                 private int iteration;
                 @Override
                 public void adtionPerformed(ActionEvent evt) {
    
                    try {
    
                        String testSpring = null;
                        String tVarString = null;
    
                        testSpring = inputExpression;
                        tVarString = String.valueOf(iteration);
                        testSpring = testSpring.replaceAll("t", tVarString);
    
                        Equation equation = new Equation(testSpring);
    
                        graph.addEquation(equation);
    
                     } catch (EquationSyntaxException e) {
                        e.printStackTrace();
                    } finally {
                         iteration++
                         if (iteration > 4) {
                             ((Timer)evt.getSource()).stop();
                         }
                    }
                }
            });
            timer.start();
    
        }
    });