diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChart.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChart.java index 60b3615..d7b34ff 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChart.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChart.java @@ -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= + 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, 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 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 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 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; } } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WorkingDaysWindow.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WorkingDaysWindow.java index 4cb4e44..723d75c 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WorkingDaysWindow.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WorkingDaysWindow.java @@ -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);