更改甘特图中子任务颜色的代码

Posted

技术标签:

【中文标题】更改甘特图中子任务颜色的代码【英文标题】:Code for changing the color of subtasks in Gantt Chart 【发布时间】:2012-02-14 20:35:27 【问题描述】:

我需要更改Gantt chart 中子任务的颜色。我的示例基于GanttDemo2,具有以下数据集和渲染器。在不同的论坛中,我发现了一些与该主题相关的讨论,但我没有找到一个清晰简单的工作示例。特别是我可以改变任务的颜色,但是我不知道如何提取子任务。

private IntervalCategoryDataset createSampleDataset() 

    final TaskSeries s1 = new TaskSeries("Scheduled");

    final Task t1 = new Task(
        "Design", date(1, Calendar.APRIL, 2001), date(1, Calendar.MAY, 2001));
    t1.addSubtask(new Task("Design 1", date(1, Calendar.APRIL, 2001), date(15, Calendar.APRIL, 2001)));
    t1.addSubtask(new Task("Design 2", date(16, Calendar.APRIL, 2001), date(25, Calendar.APRIL, 2001)));
    t1.addSubtask(new Task("Design 3", date(26, Calendar.APRIL, 2001), date(1, Calendar.MAY, 2001)));
    s1.add(t1);

    final Task t2 = new Task(
        "Proposal", date(1, Calendar.JUNE, 2001), date(1, Calendar.JULY, 2001));
    t2.addSubtask(new Task("Proposal 1", date(1, Calendar.JUNE, 2001), date(15, Calendar.JUNE, 2001)));
    t2.addSubtask(new Task("Proposal 2", date(16, Calendar.JUNE, 2001), date(25, Calendar.JUNE, 2001)));
    t2.addSubtask(new Task("Proposal 3", date(26, Calendar.JUNE, 2001), date(1, Calendar.JULY, 2001)));
    s1.add(t2);

    final TaskSeriesCollection collection = new TaskSeriesCollection();
    collection.add(s1);
    return collection;


class MyRenderer extends GanttRenderer 

    private static final Color subtask1Color = Color.blue;
    private static final Color subtask2Color = Color.cyan;
    private static final Color subtask3Color = Color.green;
    private static final long serialVersionUID = 1L;

    public MyRenderer() 
        super();
    

    @Override
    public Paint getItemPaint(int row, int col) 
        System.out.println(row + " " + col + " " + super.getItemPaint(row, col));
        if (row == 0) 
            return subtask1Color;
         else if (row == 1) 
            return subtask2Color;
         else if (row == 2) 
            return subtask3Color;
         else 
            return super.getItemPaint(row, col);
        
    

【问题讨论】:

+1 用于 sscce;添加了指向受版权保护的来源的链接。 【参考方案1】:

正如here 建议的那样,自定义渲染器可以查询模型以调节getItemPaint() 返回的结果。在此示例中,子任务是使用给定系列的默认颜色的不同饱和度的调色板呈现的。该方法假设渲染器进行两次传递;应该注意记录依赖关系。

/** @see https://***.com/questions/8938690 */
private static class MyRenderer extends GanttRenderer 

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

    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();
        Color c = (Color) super.getItemPaint(row, col);
        float[] a = new float[3];
        Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), a);
        TaskSeries series = (TaskSeries) model.getRowKeys().get(row);
        List<Task> tasks = series.getTasks(); // unchecked
        int taskCount = tasks.get(col).getSubtaskCount();
        taskCount = Math.max(1, taskCount);
        for (int i = 0; i < taskCount; i++) 
            clut.add(Color.getHSBColor(a[0], a[1] / i, a[2]));
        
    

【讨论】:

注意:在这个几何回归中,除以零会自动固定到最大饱和度。改变饱和度和/或亮度的其他方案也是可能的。 我明白,但我可以有完整的源代码吗?所以,我可以更好地理解我的进一步过程。我需要的正是我在这里看到的。 @ParthBhayani:为了更好地理解,请参阅How to Ask 一个新问题;引用这个answer;使用标签jfreechart;使用this data,包括一个minimal reproducible example,显示你卡在哪里。【参考方案2】:

或者您可以扩展任务并使用线程局部变量来跟踪渲染器访问的最后一项:

private ThreadLocal<Integer> lastSubTask = new ThreadLocal<Integer>();
...
private class MyTask extends Task 
    ...
    public Task getSubtask(int index) 
        lastSubTask.set(index);
        return super.getSubtask(index);
    

...
private class MyRenderer extends GanttRenderer 
    ...
    public Paint getCompletePaint() 
        Integer index = lastSubTask.get();
        return getColorForSubTask(index);
    
    ...

这可能对 jfreechart 的变化更具弹性。

【讨论】:

以上是关于更改甘特图中子任务颜色的代码的主要内容,如果未能解决你的问题,请参考以下文章

Scrum敏捷开发中可以有任务分解甘特图吗?还有会议记录这些?谢谢了!

metasfresh 甘特图组件的设计分析

metasfresh 甘特图组件的设计分析

metasfresh 甘特图组件的设计分析

第二阶段:1.流程图:9.excel绘制甘特图

甘特图(横道图)时间坐标跨年度月份,如何编排?