Added several improvements, changes and bug fixes

This commit is contained in:
Robert Vokac 2024-03-10 17:21:57 +00:00
parent 066aa76ca4
commit 46130d1855
No known key found for this signature in database
GPG Key ID: 693D30BEE3329055
2 changed files with 73 additions and 47 deletions

View File

@ -8,10 +8,18 @@ import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.time.Day;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.nanoboot.utils.timecalc.utils.common.NumberFormats;
import javax.swing.BorderFactory;
@ -20,6 +28,8 @@ import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
/**
@ -33,53 +43,58 @@ public class ArrivalChart extends JPanel {
private static final Color PURPLE = new Color(128,0, 255);
public static final Rectangle EMPTY_RECTANGLE = new Rectangle();
public ArrivalChart(ArrivalChartData data) {
public ArrivalChart(ArrivalChartData data, int width) {
this(data.getDays(), data.getArrival(), data.getTarget(), data.getMa7(), data.getMa14(), data.getMa28(), data.getMa56(),
data.getStartDate(), data.getEndDate());
data.getStartDate(), data.getEndDate(), width);
}
public ArrivalChart(String[] days, double[] arrival, double target, double[] ma7,
double[] ma14, double[] ma28, double[] ma56, String startDate, String endDate) {
double[] ma14, double[] ma28, double[] ma56, String startDate, String endDate, int width) {
this.setLayout(null);
this.setVisible(true);
//
String title = "Arrivals";
CategoryDataset dataset =
createDataset(days, arrival, target, ma7, ma14, ma28, ma56, title, startDate, endDate);
JFreeChart chart = createChart(dataset, title);
List<TimeSeries> timeSeries=
createSeries(days, arrival, target, ma7, ma14, ma28, ma56, title, startDate, endDate);
JFreeChart chart = createChart(timeSeries, title);
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
chartPanel.setBackground(Color.white);
chartPanel.setDomainZoomable(true);
chartPanel.setMouseZoomable(true);
this.add(chartPanel);
chartPanel.setBounds(10, 10, 1200, 400);
chartPanel.setBounds(10, 10, width, 400);
}
public static JFreeChart createChart(CategoryDataset dataset,
public static JFreeChart createChart(List<TimeSeries> timeSeries,
String title) {
JFreeChart chart = ChartFactory.createLineChart(
JFreeChart chart = ChartFactory.createTimeSeriesChart(
title,
"Date",
title,
dataset,
PlotOrientation.VERTICAL,
true,
true,
false
"Value",
new TimeSeriesCollection(new TimeSeries("Date"))
);
CategoryPlot plot = chart.getCategoryPlot();
LineAndShapeRenderer renderer = new LineAndShapeRenderer();
renderer.setDrawOutlines(false);
XYPlot plot = (XYPlot) chart.getPlot();
for(int i = 0; i < 6; i++) {
plot.setDataset(i, new TimeSeriesCollection(timeSeries.get(i)));
}
chart.setBorderVisible(false);
BiConsumer<Integer, Color> setSeries = (i, c) -> {
renderer.setSeriesPaint(i, c);
renderer.setSeriesStroke(i, new BasicStroke(dataset.getRowCount() > 180 ? 1.0f : (i == 1 || i == 2 ? 1.5f : 1.25f)));
renderer.setSeriesShape(i, EMPTY_RECTANGLE);
XYItemRenderer renderer = new XYLineAndShapeRenderer();
// renderer.setDefaultPaint(c);
// renderer.setDefaultStroke(new BasicStroke(timeSeries.get(0).getItemCount() > 180 ? 1.0f : (i == 1 || i == 2 ? 1.5f : 1.25f)));
// renderer.setDefaultShape(EMPTY_RECTANGLE);
renderer.setSeriesPaint(0, c);
renderer.setSeriesStroke(0, new BasicStroke(i == 1 || i == 2 ? 2.5f : 1.5f));
renderer.setSeriesShape(0, EMPTY_RECTANGLE);
plot.setRenderer(i, renderer);
};
setSeries.accept(0, Color.GRAY);
setSeries.accept(1, ORANGE);
@ -88,7 +103,6 @@ public class ArrivalChart extends JPanel {
setSeries.accept(4, BROWN);
setSeries.accept(5, PURPLE);
plot.setRenderer(renderer);
plot.setBackgroundPaint(Color.white);
// plot.setRangeGridlinesVisible(true);
@ -99,12 +113,12 @@ public class ArrivalChart extends JPanel {
chart.getLegend().setFrame(BlockBorder.NONE);
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
domainAxis.setLabelFont(SwingUtils.VERY_SMALL_FONT);
domainAxis.setTickLabelFont(SwingUtils.VERY_SMALL_FONT);
domainAxis.setCategoryLabelPositionOffset(10);
domainAxis.setTickLabelsVisible(true);
// CategoryAxis domainAxis = plot.getDomainAxis();
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
// domainAxis.setLabelFont(SwingUtils.VERY_SMALL_FONT);
// domainAxis.setTickLabelFont(SwingUtils.VERY_SMALL_FONT);
// domainAxis.setCategoryLabelPositionOffset(10);
// domainAxis.setTickLabelsVisible(true);
chart.setTitle(new TextTitle(title,
new Font("Serif", Font.BOLD, 18)
)
@ -113,7 +127,7 @@ public class ArrivalChart extends JPanel {
return chart;
}
private CategoryDataset createDataset(String[] days, double[] arrival, double target,
private List<TimeSeries> createSeries(String[] days, double[] arrival, double target,
double[] ma7, double[] ma14, double[] ma28,
double[] ma56, String title, String startDate, String endDate) {
if (startDate == null) {
@ -122,14 +136,20 @@ public class ArrivalChart extends JPanel {
if (endDate == null) {
endDate = "0-0-0";
}
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String seriesArrival = "Arrival";
String seriesTarget = "Target (" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES.format(target) + " h)";
String seriesMa7 = "MA7";
String seriesMa14 = "MA14";
String seriesMa28 = "MA28";
String seriesMa56 = "MA56";
List<TimeSeries> result = new ArrayList<>();
final TimeSeries seriesArrival = new TimeSeries( "Arrival" );
final TimeSeries seriesTarget = new TimeSeries( "Target (" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES.format(target) + " h)");
final TimeSeries seriesMa7 = new TimeSeries( "MA7" );
final TimeSeries seriesMa14 = new TimeSeries( "MA14" );
final TimeSeries seriesMa28 = new TimeSeries( "MA28" );
final TimeSeries seriesMa56 = new TimeSeries( "MA56" );
result.add(seriesArrival);
result.add(seriesTarget);
result.add(seriesMa7);
result.add(seriesMa14);
result.add(seriesMa28);
result.add(seriesMa56);
String[] dayArray0 = startDate.split("-");
int year1 = Integer.valueOf(dayArray0[0]);
int month1 = Integer.valueOf(dayArray0[1]);
@ -161,15 +181,17 @@ public class ArrivalChart extends JPanel {
continue;
}
}
dataset.addValue(arrival[i], seriesArrival, date);
dataset.addValue(0, seriesTarget, date);
dataset.addValue(ma7[i], seriesMa7, date);
dataset.addValue(ma14[i], seriesMa14, date);
dataset.addValue(ma28[i], seriesMa28, date);
dataset.addValue(ma56[i], seriesMa56, date);
Day day3 = new Day(day, month, year);
seriesArrival.add(day3, new Double(arrival[i]));
seriesTarget.add(day3, new Double(0d));
seriesMa7.add(day3, new Double(ma7[i]));
seriesMa14.add(day3, new Double(ma14[i]));
seriesMa28.add(day3, new Double(ma28[i]));
seriesMa56.add(day3, new Double(ma56[i]));
}
return dataset;
return result;
}
}

View File

@ -3,6 +3,7 @@ package org.nanoboot.utils.timecalc.swing.common;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@ -37,6 +38,7 @@ public class WorkingDaysWindow extends TWindow {
private final double target;
private final TTextField startTextField;
private final TTextField endTextField;
private final int chartWidth;
private ArrivalChart arrivalChart;
private JTable table = null;
@ -127,9 +129,11 @@ public class WorkingDaysWindow extends TWindow {
//
ArrivalChartData acd = new ArrivalChartData(new String[]{}, new double[]{}, 7d, new double[]{}, new double[]{}, new double[]{}, new double[]{}, null, null);
this.arrivalChart = new ArrivalChart(acd);
this.arrivalChart = new ArrivalChart(acd, 1000);
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
this.chartWidth = (int) screen.getWidth() - 60;
arrivalChart.setBounds(SwingUtils.MARGIN, years.getY() + years.getHeight()+ SwingUtils.MARGIN,
1200,
(int) (screen.getWidth() - 50),
400);
add(arrivalChart);
//
@ -137,7 +141,7 @@ public class WorkingDaysWindow extends TWindow {
= new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBounds(SwingUtils.MARGIN, arrivalChart.getY() + arrivalChart.getHeight()+ SwingUtils.MARGIN,
1200,
(int) (screen.getWidth() - 50),
300);
add(scrollPane);
scrollPane.setViewportView(table);
@ -304,7 +308,7 @@ public class WorkingDaysWindow extends TWindow {
public void reloadChart(ArrivalChartData newArrivalChartData) {
Rectangle bounds = this.arrivalChart.getBounds();
remove(this.arrivalChart);
this.arrivalChart = new ArrivalChart(newArrivalChartData);
this.arrivalChart = new ArrivalChart(newArrivalChartData, chartWidth);
add(arrivalChart);
arrivalChart.setBounds(bounds);
add(arrivalChart);