2016-06-08 2 views
1

Я создаю программу RandomWalk. Большая часть программы работает так, как должна, однако есть одна серьезная проблема.Почему моя PolyLine продолжает рисовать с начала координат (0,0)?

Когда нарисована полилиния, она остается вынутой обратно в начало координат (0,0) вместо того, где была последняя точка. Я пытаюсь понять, что мне не хватает/делает неправильно, но я не могу найти проблему.

Любая помощь будет оценена по достоинству; если требуется дополнительная информация, просто спросите. Благодарю.

Главный класс

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

public class RandomWalk { 
    public static void main (String[] args) { 

     // Creating main frame 
     JFrame main = new JFrame("RandomWalk - Version 1.0"); 
     main.setSize(800, 800); 
     main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     main.setResizable(false); 
     main.setLocationRelativeTo(null); 

     // Creating content/container panel 
     JPanel container = new JPanel(); 
     container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS)); 
     main.setContentPane(container); 

     // Creating scene/canvas 
     Draw canvas = new Draw(); 
     canvas.setAlignmentX(Component.CENTER_ALIGNMENT); 

     container.add(canvas); 

     main.toFront(); 
     main.setVisible(true); 
    } 
} 

Drawing Класс

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

public class Draw extends JPanel { 

    // Starting value for i 
    public static int i = 1; 

    // Increment for line length 
    public static int inc = 10; 

    // Choose amount of lines/moves 
    public static int a = 10000; 

    // Arrays for polyline points 
    public static int[] xPoints = new int[a]; 
    public static int[] yPoints = new int[a]; 

    public Timer timer = new Timer(5, new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      xPoints[0] = 400; 
      yPoints[0] = 400; 

      if (i < a) { 

       double r = Math.random(); 

       if (r < 0.25) { 
        xPoints[i] = xPoints[i - 1] - inc; 
        yPoints[i] = yPoints[i - 1] - 0; 
        i++; 
       } else if (r < 0.50) { 
        xPoints[i] = xPoints[i - 1] + inc; 
        yPoints[i] = yPoints[i - 1] + 0; 
        i++; 
       } else if (r < 0.75) { 
        yPoints[i] = yPoints[i - 1] - inc; 
        xPoints[i] = xPoints[i - 1] - 0; 
        i++; 
       } else if (r < 1.00) { 
        yPoints[i] = yPoints[i - 1] + inc; 
        xPoints[i] = xPoints[i - 1] + 0; 
        i++; 
       } 
       repaint(); 
      } 
     } 
    }); 

    public void paintComponent(Graphics g) { 

     timer.start(); 

     g.drawPolyline(xPoints, yPoints, xPoints.length); 
    } 
} 
+0

Да, это действительно работает, но это не делает то, что я хочу. Я хочу, чтобы линия рисовалась каждый раз. Таким образом, каждое движение это привлекает. Вот почему у меня есть таймер. – jxshu

+0

О, ничего себе. Извините, я определенно прыгнул с пистолета. Отступил за закрытое голосование. :) – Jashaszun

+0

Возможно, вы хотите использовать 'g.drawPolyline (xPoints, yPoints, i)', а не '... (..., ..., xPoints.length)'? – Jashaszun

ответ

1

Вы хотите использовать g.drawPolyline(xPoints, yPoints, i);, а не g.drawPolyline(xPoints, yPoints, xPoints.length);.

Это происходит потому, что если вы используете xPoints.length, вы говорите это, чтобы использовать все ваши xPoints и yPoints массивов, даже если вы не инициализированы xPoints[j] и yPoints[j] для всех j > i (и поэтому они оба 0). Если вы используете i как длину, он будет читать только те массивы до индекса i, и все хорошо.

 Смежные вопросы

  • Нет связанных вопросов^_^