Java 更改甘特图渲染器的颜色
我想更改图表中渲染器的颜色。我用的是JFreeChart 在同一条线上。我想根据任务描述使用不同的Collor。 问题是我在一行中一直使用相同的颜色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
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);
}
}