2012-01-20 5 views
1

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); 
     } 
    } 
} 
+0

+1 for sscce;著作権のあるソースへのリンクを追加しました。 – trashgod

答えて

4

としては、カスタムレンダラがgetItemPaint()によって返された結果を調整するためにモデルを照会することができ、hereを示唆しました。この例では、サブタスクは、与えられたシリーズのデフォルトカラーの彩度の異なるパレットを使用してレンダリングされます。このアプローチでは、レンダラーが2回のパスを行うと仮定しています。依存関係を文書化するためにいくつかの注意を払う必要があります。

GanttSubtaskDemo

/** @see https://stackoverflow.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])); 
     } 
    } 
} 
+0

NB:この幾何学的回帰では、ゼロ除算は自動的に最大彩度に固定されます。彩度および/または明るさを変える他の方式も可能である。 – trashgod

+0

この関連[例](http://stackoverflow.com/a/9875534/230513)も参照してください。 – trashgod

+0

私は理解していますが、このための完全なソースコードがありますか?だから私はそれを私の次のプロセスのためによく理解することができます。私はここで見たことがまさに必要です。 –

0

それとも、タスクを拡張し、レンダラによってアクセス最後の項目を追跡するために、スレッドローカル変数を使用することができます。

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の変更。

関連する問題