2015-02-24 57 views
0

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

Link,这部分用于整个代码

这是应该改变的绘图类代码的一部分:

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

     } 
    }); 

这是节目的图象:

enter image description here

我p只是通过点击绘图按钮 来运行程序,但是如果这个计时器可能会影响JSlider ,所以t的最小值和最大值将是Jslider的最小值和最大值,并且通过点击绘图就可以开始绘图了时间滑块旋钮将在价值点在t

+1

看看[Swing Time r](http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) – MadProgrammer 2015-02-24 20:51:19

+0

@MadProgrammer我已经做到了。我试过不同的方法来实现计时器,但它已经失败 你能更具体地说明如何改变这个吗? – Vicarious 2015-02-24 20:52:59

+1

请记住,一个'Timer'只是一个伪循环 – MadProgrammer 2015-02-24 21:12:33

回答

1

看看How to use Swing Timers

这将允许您设置每隔一定的时间,这是从美国东部时间范围内执行的回调,使得它的安全从内部更新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(); 

    } 
});