Нарисовать график функции по точкам

Как мне нарисовать график функции по точкам, которые берутся из файла? Проблема в том, что точек две тысячи, и каждый раз, когда я отрисоваю n-ое кол-во точек, то paintComponent() просто перерисовывает JPanel, может быть как-то можно зарисовать какой-то холст, а после сохранить его в виде картинки?

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
 
public class Field extends JPanel {
 
    Frame frame;
 
    public Field(Frame frame) {
        this.frame = frame;
    }
 
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int i = 0;
        while (true) {
            if (i == 2001)
                i = 0;
            int x = frame.coordX.get(i).intValue();
            int y = frame.coordY.get(i).intValue();
            paintPoint(g, x, y);
            i++;
        }
    }
 
    void paintPoint(Graphics g, int x, int y) {
        g.setColor(Color.WHITE);
        g.drawOval(x, y, 2, 2);
    }
}
 
public class Frame extends JFrame {
 
    List<Double> coordX = new ArrayList<>();
    List<Double> coordY = new ArrayList<>();
 
    private Field field = new Field(this);
 
    public Frame() {
        initialFrame();
        initialArray();
    }
 
    public static void main(String[] args) {
        new Frame();
    }
 
    private void initialFrame() {
        setTitle("Graphics");
        setSize(800, 800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);
        field.setBackground(Color.GRAY);
        add(field);
        setVisible(true);
    }
    private void initialArray() {
 
        File file = Path.of("src", "2022-12-14_1A_008_obzor_s_vrsh_10-110_1-8-1.txt").toFile();
 
        try (BufferedReader fileReader = new BufferedReader(new FileReader(file))) {
            while (fileReader.ready()) {
                String string = fileReader.readLine();
                String[] arStrings = string.split(" ");
                coordX.add(Double.parseDouble(arStrings[0]) * 10);
                coordY.add(Double.parseDouble(arStrings[arStrings.length - 1]) / 10);
 
            }
//            String collect = fileReader.lines()
//                    .collect(Collectors.joining("\n"));
//            System.out.println(collect);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
 
    }
 
}

Ответы (1 шт):

Автор решения: Waden

Необходимо было просто в методе paintPoint() использовать цикл, а не в paintComponent(g)

@Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        paintPoint(g);
    }


 void paintPoint(Graphics g) {
        g.setColor(Color.WHITE);
        for (int i = 0; i < 2001; i++) {
            int x = frame.coordX.get(i).intValue();
            int y = frame.coordY.get(i).intValue();
            g.drawOval(x, y, 2,2);
        }
    }
→ Ссылка