Настраиваемый текст для подзадач в Gantt Chart jfreechart Java - PullRequest
0 голосов
/ 21 марта 2019

Я создал диаграмму Ганта с JFreeChart, где я реализовал задачу планирования заданий (JSSP), где машина выполняет определенные подзадачи для задачи / задания. Таким образом, я хочу, чтобы каждая подзадача, которая принадлежит определенной задаче / заданию, имела одинакового цвета .

Проблема заключается в том, что мне нужно создать собственный текст для подзадач.

например. Я хочу, чтобы все подзадачи, относящиеся к задаче 1, были помечены (1.1, 1.2, ..., 1.n), когда задача 1 имеет n подзадач.

Я посмотрел здесь несколько ссылок, например, следующий, но не может заставить его работать: Текстовые метки внутри столбцов диаграммы Ганта

У меня есть идея, что это как-то связано с setBaseItemLabelGenerator, который я пытался показать ниже, но, конечно, не работает.

Кто-нибудь может мне помочь? Я добавлю свой код для справки. Заранее спасибо.

public class Draw extends ApplicationFrame {

    //private int maxSpan = 20;
    public static final TaskSeriesCollection model = new TaskSeriesCollection();

    public Draw(final String title) {

        super(title);

        final IntervalCategoryDataset dataset = createSampleDataset();

        // create the chart...
        final JFreeChart chart = ChartFactory.createGanttChart(
            "Gantt Chart",  // chart title
            "Machines",              // domain axis label
            "TimeLine",              // range axis label
            dataset,             // data
            true,                // include legend
            true,                // tooltips
            false                // urls
        );
        final CategoryPlot plot = (CategoryPlot) chart.getPlot();
        DateAxis axis = (DateAxis) plot.getRangeAxis();
        axis.setDateFormatOverride(new SimpleDateFormat("S"));
        axis.setMaximumDate(new Date(50));

        // add the chart to a panel...
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(chartPanel);

        MyRenderer renderer = new MyRenderer(model);
        plot.setRenderer(renderer);
        renderer.setBaseItemLabelGenerator( new CategoryItemLabelGenerator(){

            @Override
            public String generateRowLabel(CategoryDataset dataset, int row) {
                return "Your Row Text  " + row;
            }

            @Override
            public String generateColumnLabel(CategoryDataset dataset, int column) {
                return "Your Column Text  " + column;
            }

            @Override
            public String generateLabel(CategoryDataset dataset, int row, int column) {
                return "Your Label Text  " + row + "," + column;
            }

        });
        renderer.setBaseItemLabelsVisible(true);
        renderer.setBaseItemLabelPaint(Color.BLACK);
        renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
        ItemLabelAnchor.INSIDE6, TextAnchor.BOTTOM_CENTER));

        this.pack();
        RefineryUtilities.centerFrameOnScreen(this);
        this.setVisible(true);

    }

    /** @see https://stackoverflow.com/a/8949913/230513 */
    private static class MyRenderer extends GanttRenderer {

        private static final int PASS = 2; // assumes two passes
        private final List<Color> clut = new ArrayList<>();
        private final TaskSeriesCollection model;
        private int row;
        private int col;
        private int index;

        //NB FIX COLORS
        static final List<Color> colors = new ArrayList<Color>() {{
            add(Color.BLACK);
            add(Color.BLUE);
            add(Color.GREEN);
            add(Color.RED);
            add(Color.CYAN);
            add(Color.YELLOW);
            add(Color.ORANGE);
            add(Color.PINK);
            add(Color.DARK_GRAY);
            add(Color.MAGENTA);
            add(Color.GRAY);
            add(Color.LIGHT_GRAY);
            add(Color.ORANGE);
            add(Color.CYAN);
            add(Color.PINK);
            add(Color.DARK_GRAY);
            add(Color.MAGENTA);
            add(Color.GRAY);
            add(Color.LIGHT_GRAY);
            add(Color.RED);
            add(Color.CYAN);
            add(Color.YELLOW);
            add(Color.ORANGE);
        }};

        public MyRenderer(TaskSeriesCollection model) {
            this.model = model;
        }

        @Override
        public Paint getItemPaint(int row, int col) {

            if (clut.isEmpty() || this.row != row || this.col != col) {
                initClut(row, col);
                this.row = row;
                this.col = col;
                index = 0;
            }
            int clutIndex = index++ / PASS;
            return clut.get(clutIndex);
        }

        private void initClut(int row, int col) {
            clut.clear();

            TaskSeries series = (TaskSeries) model.getRowKeys().get(row);

            //NB! amt of machines is amt of tasks
            List<Task> amtMachines = series.getTasks(); // unchecked 

            //TASKCOUNT is amount of jobs --> subtasks
            int noJobs = amtMachines.get(col).getSubtaskCount();
            noJobs = Math.max(1, noJobs);
            String description;

            //loop over all jobs
            for (int i = 0; i < noJobs; i++) {

                //get this task, loop over all subtasks in this task
                description = amtMachines.get(col).getSubtask(i).getDescription();

                //check which color this task has
                for(int j = 0; j < schedule[0].length;j++) {
                    String string = "subtask" + j;
                    if(description.equals(string)){
                        clut.add(this.colors.get(j));
                    }
                }
            }
        }
    }

    private IntervalCategoryDataset createSampleDataset() {
        Task tasks[]= new Task[schedule.length]; //Potentially increasing runtime
        Random r = new Random();
        List<Task> taskList = new ArrayList<>();

        final TaskSeries s = new TaskSeries("Jobs scheduled");

        //for all machines
        for(int i = 0; i < schedule.length;i++) {

            Task subtasks[]= new Task[schedule[0].length];

            //machineString
            String str = "M" + i;

            //create Task
            tasks[i] =  new Task(str, new SimpleTimePeriod(schedule[i][0][0], schedule[i][schedule[1].length-1][0]+schedule[i][schedule[1].length-1][1]));
            taskList.add(tasks[i]);

            //create amt of jobs aka. subtasks
            for(int j = 0; j < schedule[0].length;j++) {
                String string = "subtask" + j;
                subtasks[j] =  new Task(string, new SimpleTimePeriod(schedule[i][j][0], schedule[i][j][0]+schedule[i][j][1]));
                tasks[i].addSubtask(subtasks[j]);
            }
        }
        for(Task t : taskList) {
            s.add(t);
        }
        model.add(s);
        return model;
    }
}
...