java 中带计时器的绘图仪

Graph plotter with timer in java

我正在研究一个绘图器,它从用户那里得到一个像 x^2 + t 这样的表达式,然后会向用户询问 x 和 t 的范围。 这里的 t 是定时器变量。 例如,在 x^2 + t 中,用户将为 x 选择 -10 到 10,为 t 选择 1 到 5。现在通过单击 GUI 程序中的绘图按钮,代码将从最小 t(此处为 1)开始绘制表达式,并且在每一秒(或任何时间段)之后将 t 值增加一个并使用新的 t(2 ,3 直到达到最大范围)。 如何让事件处理程序执行此操作?我找到了一种绘制多个图形的方法,但我不能延迟,所以从最小值到最大值。 我知道我应该使用计时器,但我不知道如何在这部分代码中使用

整个代码的Link

这是 plotter class 中应该更改的代码部分:

// 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();
            }

        }
    });

这是节目的图片:

我的首要任务是通过单击绘图按钮制作程序 运行 但如果这个计时器可以影响 JSlider 会更好 所以 t 的最小值和最大值将是 Jslider 的最小值和最大值,并且通过单击绘制它将在每次滑块旋钮指向 t

的值时开始绘制

看看How to use Swing Timers

这将允许您定期设置回调,该回调在 EDT 的上下文中执行,从而可以安全地从

中更新 UI
    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();

    }
});