Java 更改甘特图渲染器的颜色

Java 更改甘特图渲染器的颜色,java,jfreechart,Java,Jfreechart,我想更改图表中渲染器的颜色。我用的是JFreeChart 在同一条线上。我想根据任务描述使用不同的Collor。 问题是我在一行中一直使用相同的颜色 package testJFreeChart; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.geom.Rectangle2D; import java

我想更改图表中渲染器的颜色。我用的是JFreeChart 在同一条线上。我想根据任务描述使用不同的Collor。 问题是我在一行中一直使用相同的颜色

package testJFreeChart;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.geom.Rectangle2D;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.CategoryItemEntity;
import org.jfree.chart.entity.EntityCollection;
import org.jfree.chart.labels.CategoryItemLabelGenerator;
import org.jfree.chart.labels.IntervalCategoryItemLabelGenerator;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.CategoryItemRendererState;
import org.jfree.chart.renderer.category.GanttRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.IntervalCategoryDataset;
import org.jfree.data.gantt.GanttCategoryDataset;
import org.jfree.data.gantt.Task;
import org.jfree.data.gantt.TaskSeries;
import org.jfree.data.gantt.TaskSeriesCollection;
import org.jfree.data.time.SimpleTimePeriod;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RefineryUtilities;
import org.jfree.ui.TextAnchor;

public class GanttDemo2 extends ApplicationFrame {

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    public static final TaskSeriesCollection model = new TaskSeriesCollection();

    public GanttDemo2(final String title) {

        super(title);

        final IntervalCategoryDataset dataset = createSampleDataset();

        // create the chart...
        final JFreeChart chart = ChartFactory.createGanttChart(
                "Diagramme de Gantt", // chart title
                "Processus", // domain axis label
                "temps(ms)", // range axis label
                dataset, // data
                true, // include legend
                true, // tooltips
                false // urls
        );
        final CategoryPlot plot = (CategoryPlot) chart.getPlot();
        DateAxis range = (DateAxis) plot.getRangeAxis();
        range.setDateFormatOverride(new SimpleDateFormat("SSS"));
        range.setMaximumDate(new Date(300));

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

        //GanttRenderer personnalisé..
        MyRenderer renderer = new MyRenderer(model);
        renderer.setBaseItemLabelGenerator(new CategoryItemLabelGenerator() {

            public String generateLabel(CategoryDataset dataSet, int series, int categories) {
                String label = "task";
                return label;
            }

            public String generateColumnLabel(CategoryDataset dataset, int categories) {
                //System.out.println(dataset.getColumnKey(categories).toString());
                return dataset.getColumnKey(categories).toString();
            }

            public String generateRowLabel(CategoryDataset dataset, int series) {
                return dataset.getRowKey(series).toString();
            }
        });

        renderer.setBaseItemLabelsVisible(true);
        renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE9, TextAnchor.CENTER_LEFT));

        plot.setRenderer(renderer);
        plot.setBackgroundPaint(Color.WHITE);

    }

    /** @see http://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 result = Color.cyan;

            TaskSeries series = (TaskSeries) model.getRowKeys().get(row);
            List<Task> tasks = series.getTasks(); // unchecked 

            int taskCount = tasks.get(col).getSubtaskCount();
            taskCount = Math.max(1, taskCount);

            System.out.println("---->" + taskCount);
            String description;

            for (int i = 0; i < taskCount; i++) {

       // if(taskCount!=1){
                //clut.remove(result);
                description = tasks.get(col).getSubtask(i).getDescription();

                System.out.println(description + "  " + i);
                if (description.equals("bloque")) {
                    result = Color.green;
                    clut.add(result);
                    System.out.println("yessssss");
                }
                if (description.equals("ES")) {
                    result = Color.yellow;
                    clut.add(result);
                }
                if (description.equals("Exec")) {
                    result = Color.blue;
                    clut.add(result);
                    System.out.println("NOOOOO");
                }

                //   }
                clut.add(result);
            }

        }

    }

    private IntervalCategoryDataset createSampleDataset() {

        final TaskSeries s1 = new TaskSeries("");

        final Task t = new Task("P0", new SimpleTimePeriod(30, 50));
        final Task st0 = new Task("Exec", new SimpleTimePeriod(10, 20));
        // Task st01 = new Task( "ES",new SimpleTimePeriod(30,60));
        t.addSubtask(st0);
  //   t.addSubtask(st01);

        s1.add(t);

        final Task t1 = new Task("P1", new SimpleTimePeriod(5, 10));

        final Task st11 = new Task("ES", new SimpleTimePeriod(10, 20));
        Task st12 = new Task("Exec", new SimpleTimePeriod(30, 60));
        t1.addSubtask(st11);
        t1.addSubtask(st12);
        s1.add(t1);

        final Task t3 = new Task("P2", new SimpleTimePeriod(0, 40));
        final Task st31 = new Task("bloque", new SimpleTimePeriod(5, 30));
        final Task st32 = new Task("Exec", new SimpleTimePeriod(50, 60));

        t3.addSubtask(st31);

        t3.addSubtask(st32);

        s1.add(t3);

        model.add(s1);

        return model;
    }

    public static void main(final String[] args) {

        final GanttDemo2 demo = new GanttDemo2("Gantt Chart Demo 2");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);

    }
}
package-testJFreeChart;
导入java.awt.Color;
导入java.awt.GradientPaint;
导入java.awt.Graphics2D;
导入java.awt.Paint;
导入java.awt.geom.Rectangle2D;
导入java.text.simpleDataFormat;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.List;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.axis.CategoryAxis;
导入org.jfree.chart.axis.DateAxis;
导入org.jfree.chart.axis.ValueAxis;
导入org.jfree.chart.entity.CategoryItemEntity;
导入org.jfree.chart.entity.EntityCollection;
导入org.jfree.chart.labels.CategoryItemLabelGenerator;
导入org.jfree.chart.labels.IntervalCategoryItemLabelGenerator;
导入org.jfree.chart.labels.ItemLabelAnchor;
导入org.jfree.chart.labels.ItemLabelPosition;
导入org.jfree.chart.plot.CategoryPlot;
导入org.jfree.chart.plot.PlotOrientation;
导入org.jfree.chart.renderer.category.CategoryItemRenderer;
导入org.jfree.chart.renderer.category.CategoryItemRenderState;
导入org.jfree.chart.renderer.category.GanttRenderer;
导入org.jfree.data.category.CategoryDataset;
导入org.jfree.data.category.IntervalCategoryDataset;
导入org.jfree.data.gantt.GanttCategoryDataset;
导入org.jfree.data.gantt.Task;
导入org.jfree.data.gantt.TaskSeries;
导入org.jfree.data.gantt.TaskSeriesCollection;
导入org.jfree.data.time.SimpleTimePeriod;
导入org.jfree.ui.ApplicationFrame;
导入org.jfree.ui.RectangleEdge;
导入org.jfree.ui.RefineryUtilities;
导入org.jfree.ui.TextAnchor;
公共类GantDemo2扩展了ApplicationFrame{
/**
*
*/
私有静态最终长serialVersionUID=1L;
公共静态最终TaskSeriesCollection模型=新TaskSeriesCollection();
公共甘特Demo2(最终字符串标题){
超级(标题);
最终IntervalCategoryDataset dataset=createSampleDataset();
//创建图表。。。
最终JFreeChart图表=ChartFactory.CreateGantChart(
“甘特图”//图表标题
“Processus”,//域轴标签
“temps(ms)”,//范围轴标签
数据集,//数据
true,//包含图例
true,//工具提示
false//url
);
final CategoryPlot plot=(CategoryPlot)chart.getPlot();
DateAxis范围=(DateAxis)plot.getRangeAxis();
range.setDateFormatOverride(新的SimpleDataFormat(“SSS”);
范围。设置最大日期(新日期(300));
//将图表添加到面板。。。
最终图表面板图表面板=新图表面板(图表);
setPreferredSize(新java.awt.Dimension(500270));
setContentPane(图表面板);
//甘特伦德雷尔·帕森那利斯©公司。。
MyRenderer=新的MyRenderer(模型);
renderer.setBaseItemLabelGenerator(新类别ItemLabelGenerator(){
公共字符串生成器标签(CategoryDataset数据集、int系列、int类别){
String label=“任务”;
退货标签;
}
公共字符串generateColumnLabel(CategoryDataset数据集,int categories){
//System.out.println(dataset.getColumnKey(categories.toString());
返回dataset.getColumnKey(categories.toString();
}
公共字符串生成器WLabel(CategoryDataset数据集,int系列){
返回dataset.getRowKey(series.toString();
}
});
renderer.setBaseItemLabelsVisible(true);
renderer.setBasePositiveItemLabelPosition(新的ItemLabelPosition(ItemLabelAnchor.Outside 9,TextAnchor.CENTER_左));
plot.setRenderer(渲染器);
立根底色漆(颜色:白色);
}
/**@见http://stackoverflow.com/questions/8938690 */
私有静态类MyRenderer扩展了GanttRenderer{
私有静态final int PASS=2;//假定有两个过程
私有最终列表clut=new ArrayList();
私人最终任务系列收集模型;
私人int row;
私人国际学院;
私有整数索引;
公共MyRenderer(TaskSeriesCollection模型){
this.model=模型;
}
@凌驾
公共绘制getItemPaint(int行,int列){
if(clut.isEmpty()| | this.row!=row | | this.col!=col){
initClut(行、列);
this.row=行;
this.col=col;
指数=0;
}
int-clutIndex=index++/PASS;
返回clut.get(clutIndex);
}
私有void initClut(int行,int列){
clut.clear();
颜色结果=Color.cyan;
TaskSeries=(TaskSeries)model.getRowKeys().get(row);
List tasks=series.getTasks();//未选中
int taskCount=tasks.get(col.getSubtaskCount();
taskCount=Math.max(1,taskCount);
System.out.println(“--->”+任务计数);
字符串描述;
对于(int i=0;i 1
exec: 0
blue
----> 2
ES: 0
yellow
exec: 1
blue
----> 2
bloque: 0
green
exec: 1
blue
package chart;

import java.awt.Color;
import java.awt.Paint;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.GanttRenderer;
import org.jfree.data.category.IntervalCategoryDataset;
import org.jfree.data.gantt.Task;
import org.jfree.data.gantt.TaskSeries;
import org.jfree.data.gantt.TaskSeriesCollection;
import org.jfree.data.time.SimpleTimePeriod;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class GanttDemo2 extends ApplicationFrame {

    private static final long serialVersionUID = 1L;
    public static final TaskSeriesCollection model = new TaskSeriesCollection();

    public GanttDemo2(final String title) {
        super(title);
        final IntervalCategoryDataset dataset = createSampleDataset();
        // create the chart...
        final JFreeChart chart = ChartFactory.createGanttChart(
                "Diagramme de Gantt", // chart title
                "Processus", // domain axis label
                "temps(ms)", // range axis label
                dataset, // data
                false, // include legend
                true, // tooltips
                false // urls
        );
        final CategoryPlot plot = (CategoryPlot) chart.getPlot();
        DateAxis range = (DateAxis) plot.getRangeAxis();
        range.setDateFormatOverride(new SimpleDateFormat("SSS"));
        range.setMaximumDate(new Date(100));

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

        //GanttRenderer personnalisé..
        MyRenderer renderer = new MyRenderer(model);
        plot.setRenderer(renderer);
        plot.setBackgroundPaint(Color.WHITE);
    }

    /**
     * @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<>();
        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();

            TaskSeries series = (TaskSeries) model.getRowKeys().get(row);
            List<Task> tasks = series.getTasks(); // unchecked 

            int taskCount = tasks.get(col).getSubtaskCount();
            taskCount = Math.max(1, taskCount);

            System.out.println("----> " + taskCount);
            String description;

            for (int i = 0; i < taskCount; i++) {
                description = tasks.get(col).getSubtask(i).getDescription();

                System.out.println(description + ": " + i);
                if (description.equals("bloque")) {
                    clut.add(Color.green);
                    System.out.println("green");
                }
                if (description.equals("ES")) {
                    clut.add(Color.yellow);
                    System.out.println("yellow");
                }
                if (description.equals("exec")) {
                    clut.add(Color.blue);
                    System.out.println("blue");
                }
            }
        }
    }

    private IntervalCategoryDataset createSampleDataset() {
        final TaskSeries s1 = new TaskSeries("");
        final Task t0 = new Task("P0", new SimpleTimePeriod(30, 50));
        final Task st0 = new Task("exec", new SimpleTimePeriod(10, 20));
        // Task st01 = new Task( "ES",new SimpleTimePeriod(30,60));
        t0.addSubtask(st0);
        //   t.addSubtask(st01);
        s1.add(t0);

        final Task t1 = new Task("P1", new SimpleTimePeriod(5, 10));
        final Task st11 = new Task("ES", new SimpleTimePeriod(10, 20));
        Task st12 = new Task("exec", new SimpleTimePeriod(30, 60));
        t1.addSubtask(st11);
        t1.addSubtask(st12);
        s1.add(t1);

        final Task t2 = new Task("P2", new SimpleTimePeriod(0, 40));
        final Task st31 = new Task("bloque", new SimpleTimePeriod(5, 30));
        final Task st32 = new Task("exec", new SimpleTimePeriod(50, 60));
        t2.addSubtask(st31);
        t2.addSubtask(st32);
        s1.add(t2);

        model.add(s1);
        return model;
    }

    public static void main(final String[] args) {
        final GanttDemo2 demo = new GanttDemo2("Gantt Chart Demo 2");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}