Как представить ось 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