我试图每250毫秒绘制一个新点,但它只绘制一个点

时间:2016-03-07 22:54:07

标签: java swing

//我试图每250毫秒画一个新的点,但它只画一次点。我曾多次尝试修复它,但它仍然只会绘制一个点,而不是250毫秒后的一个点。这是计时器或绘画方法的问题吗?这是代码:

import javax.swing.JPanel;
import javax.swing.Timer;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Window extends JPanel{

    private int size;
    private static double maxValue;
    private double elevation;
    private double vertV;
    public double horizV;
    public double gravity;
    public double range;
    public double time;
      public double t = 0;

    public Window(int s, double v, double e, double v2, double g,double h,double r,double t){
        size = s;
        maxValue = v;
        elevation = e;
        vertV = v2;
        gravity = g;
        horizV = h;
        range = r;
        time = t;
        setPreferredSize(new Dimension(size, size));
    }

    public void paintComponent(Graphics g){
        g.drawLine(size/25, 0,size/25, size);
        g.drawLine(0, size - (size/25), size, size - (size/25));    
        double[] lines = getLine();

        int x = size/5 + (size/25), y = size - (size/25);    
        int x2 = x;
        for(int i = 0; i < 4; i++){
            g.drawLine(x, y+5, x, y-5);      
            g.drawString(lines[i]+"",x-size/50,y+size/30);
            x+=x2;           
        }

        int yx = size/25, yy = size - (size/5 + (size/25));
        int y2 = size/5 + (size/25);
        for(int i=0;i<4;i++){
            g.drawLine(yx-5, yy, yx+5, yy);
            g.drawString(lines[i]+"",yx-size/25,yy+size/30);
            yy -= y2;

        }

        drawDots(g); 
    }

    //this is the place where i make the dots but it only makes one.
    //used to be a for loop but i altered it to an if statement so i could paint one dot at a time
    public void drawDots(Graphics g)
    {
        double ratio = (size-((size/25)*2))/maxValue;
        double fx;
        double xvalue;
        // This for loop is where dots are drawn, each iteration draws one dot. It starts at zero, and counts up to the time variable t.
        if(t<=time)
        {
            t+=0.025;
            t = Math.round(t*1000.0)/1000.0;
            fx = function(t);
            xvalue = xfunction(t);
            if(fx >= 0){     
                System.out.print("Time: " + t + " " + "Range: " + xvalue + " " + "Height: ");
                System.out.println(fx);
                g.drawLine((int)(size/25+(ratio*xvalue)), (int)((size-(size/25))-(ratio*fx)),
                        (int)(size/25+(ratio*xvalue)), (int)((size-(size/25))-(ratio*fx)));
        }
      } 
    }

    //where i make the timer 
    //250 mill
    public void dostuff()
    {
        int delay = 250; 
        ActionListener taskPerformer = new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {
                repaint();
            }

        };

        new Timer(delay, taskPerformer).start();

    }
    public double xfunction(double t){
        double x = 0.0;
        x = Math.round(horizV * t * 1000.0)/1000.0;    
        return x;
    }
    public double function(double t){
        double fx = 0.0;     
        fx = Math.round((vertV*t + .5*(-(gravity))*(t*t) + elevation)*1000.0)/1000.0;
        return fx;
    }

    private static double[] getLine(){
    double increment = maxValue / 4;
    double currentLine = 0;
        double[] lines = new double[4];
        for(int i = 0; i < 4; i++){
            currentLine+=increment;
            lines[i] = Math.round(currentLine * 10.0)/10.0;
        }
        return lines;
    }
}

这是显示射弹运动的代码的原始版本,但在绘制每个点之间不会等待250毫秒:

import javax.swing.JPanel;
import java.awt.*;

public class Window extends JPanel{

    private int size;
    private static double maxValue;
    private double elevation;
    private double vertV;
    public double horizV;
    public double gravity;
    public double range;
    public double time;


    public Window(int s, double v, double e, double v2, double g,double h,double r,double t){
        size = s;
        maxValue = v;
        elevation = e;
        vertV = v2;
        gravity = g;
        horizV = h;
        range = r;
        time = t;
        setPreferredSize(new Dimension(size, size));
    }

    public void paintComponent(Graphics g){
        g.drawLine(size/25, 0,size/25, size);
        g.drawLine(0, size - (size/25), size, size - (size/25));    
        double[] lines = getLine();

        int x = size/5 + (size/25), y = size - (size/25);    
        int x2 = x;
        for(int i = 0; i < 4; i++){
            g.drawLine(x, y+5, x, y-5);      
            g.drawString(lines[i]+"",x-size/50,y+size/30);
            x+=x2;           
        }

        int yx = size/25, yy = size - (size/5 + (size/25));
        int y2 = size/5 + (size/25);
        for(int i=0;i<4;i++){
            g.drawLine(yx-5, yy, yx+5, yy);
            g.drawString(lines[i]+"",yx-size/25,yy+size/30);
            yy -= y2;

        }

        drawDots(g); 
    }

    public void drawDots(Graphics g){
        double ratio = (size-((size/25)*2))/maxValue;
        double fx;
        double xvalue;
        // This for loop is where dots are drawn, each iteration draws one dot. It starts at zero, and counts up to the time variable t.
        for(double t=0;t<=time; t+=0.025){
            t = Math.round(t*1000.0)/1000.0;
            fx = function(t);
            xvalue = xfunction(t);
            if(fx >= 0){     
                System.out.print("Time: " + t + " " + "Range: " + xvalue + " " + "Height: ");
                System.out.println(fx);
                g.drawLine((int)(size/25+(ratio*xvalue)), (int)((size-(size/25))-(ratio*fx)),
                        (int)(size/25+(ratio*xvalue)), (int)((size-(size/25))-(ratio*fx)));
        }
      } 
    }

    public double xfunction(double t){
        double x = 0.0;
        x = Math.round(horizV * t * 1000.0)/1000.0;    
        return x;
    }
    public double function(double t){
        double fx = 0.0;     
        fx = Math.round((vertV*t + .5*(-(gravity))*(t*t) + elevation)*1000.0)/1000.0;
        return fx;
    }

    private static double[] getLine(){
    double increment = maxValue / 4;
    double currentLine = 0;
        double[] lines = new double[4];
        for(int i = 0; i < 4; i++){
            currentLine+=increment;
            lines[i] = Math.round(currentLine * 10.0)/10.0;
        }
        return lines;
    }
}

0 个答案:

没有答案