Java. Canvas. JFrame

129
16 декабря 2021, 15:20

Код ниже рисует линию, каждую секунду новую. Как можно сделать, чтобы новая линия добавлялась к старой?
То есть хочу видеть через условно двадцать секунд - двадцать линий.

1) Нужно добавлять значения для отрисовки в массив и каждый раз перерисовывать, как в закомментированной части,
2) или можно использовать старый canvas и рисовать поверх его.

Если второй вариант то как это можно сделать?

package draw;
import javax.swing.*;
import java.awt.*;
public class Test {
    static class MyCanvas extends Canvas {
        // условный массив со значениями
        // int4[] values = new int4[];
        // public void addValue(...) { // };
        static int x1 = 10;
        static int x2 = 20;
        public void paint(Graphics g) {
            g.setColor(Color.BLACK);
            //  for (int4 val: values) {
            //        g.drawLine(val[0], val[1], val[2], val[3])
            //  }
            g.drawLine(x1, x2, 200,200);
        }
    }
    public static void main(String[] args) throws InterruptedException {
        JFrame frame = new JFrame("nameOf");
        frame.setSize(200,200);
        Canvas canvas = new MyCanvas();
        frame.add(canvas);
        frame.setVisible(true);
        while (true) {
            Thread.sleep(1000);
            // canvas.addValue(...);
            MyCanvas.x1 = (int)(Math.random() * 100);
            MyCanvas.x2 = (int)(Math.random() * 100);
            canvas.repaint();
        }
    }
}
Answer 1

Нашел примерное решение, без объявления коллекции. Использовать в цикле:

canvas.getGraphics().drawLine(x1,x2,y1,y2);

Только результат не сохранится, если вызвать метод .repaint()
(например, изменить размер окна, что автоматически вызовет перерисовку)

package draw;
import javax.swing.*;
import java.awt.*;
import java.util.Scanner;
public class Test {
    static class MyCanvas extends Canvas {
        public void paint(Graphics g) {
            g.setColor(Color.BLACK);
            g.drawOval((int)(Math.random() * 100),(int)(Math.random() * 100),(int)(Math.random() * 100),(int)(Math.random() * 100));
        }
    }
    public static void main(String[] args) {
        MyCanvas canvas = new MyCanvas();
        JFrame frame = new JFrame("nameOf");
        frame.setSize(200,200);
        frame.add(canvas);
        frame.setVisible(true);
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            canvas.getGraphics().drawLine((int)(Math.random() * 100),(int)(Math.random() * 100), 200,200);
            System.out.println("---");
            scanner.nextLine();
        }
    }
}

В данном примере, для отрисовки новой линии, нужно ввести любое значение с клавиатуры в консоль.

READ ALSO
MediaType utf-8

MediaType utf-8

Отправляю запрос на сервер

194
Помогите со связным списком на Java

Помогите со связным списком на Java

Нужно удалить повторяющиеся элементы связного списка спискаВывести сначала исходный связный список, затем уже с удалением

106
Надо добавить условие победы в игру

Надо добавить условие победы в игру

Это игра с переставлением шариковИгра состоит из трёх классов : Ball , Hole и MainWindow

119