Как представить ось x localdatetime java

Аватар пользователя Сергей Якимович
Сергей Якимович
23 февраля 2023

Чтобы использовать при построении графика для оси х данные LocalDateTime, нам надо перевести их в int.

Для примера нарисуем график погоды c использованием библиотеки swing :

import javax.swing.*;
import java.awt.*;
import java.time.LocalDateTime;
import java.time.Period;
import java.util.ArrayList;
import java.util.List;

public class App {
    public static void main(String[] args) {
        // создадим список с данными погоды
        class Weather {
            LocalDateTime time;
            int temperature;

            public Weather(LocalDateTime time, int temperature) {
                this.time = time;
                this.temperature = temperature;
            }
        }
        LocalDateTime time = LocalDateTime.now();
        List<Weather> list = new ArrayList<>(List.of(new Weather(time, 0),
                new Weather(time.minusDays(1), 5), new Weather(time.minusDays(2), 0),
                new Weather(time.plusDays(1), 10), new Weather(time.plusDays(2), 5)));

        int cX = 20; // смещение для рисования осей
        int cY = 350;
        int points = list.size(); // количество точек на графике

        // создадим массив координат х
        list.sort((t1,t2) -> t1.time.compareTo(t2.time));
        LocalDateTime minTime = list.get(0).time;
        int[] xData = new int[points];
        for(int i = 0; i < points; i++) {
            xData[i] = Period.between(minTime.toLocalDate(), list.get(i).time.toLocalDate()).getDays() * 50 + cX;
        }
        // создадим массив координат y
        int[] yData = list.stream()
                .mapToInt(y -> cY - y.temperature * 10)
                .toArray();

        class PaintWeather extends JPanel {
            @Override
            protected void paintComponent(Graphics graphics) {
                Graphics2D graphics2D = (Graphics2D)graphics;
                graphics2D.drawLine(cX, cY, cX, cX); // рисуем оси
                graphics2D.drawLine(cX, cY, cY + 100, cY);
                graphics2D.drawPolyline(xData, yData, points); // рисуем график
            }
        }

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(new PaintWeather(), BorderLayout.CENTER);

        JFrame frame = new JFrame("График температур");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(panel);
        frame.setSize(500, 400);
        frame.setVisible(true);
    }
}
0 0