Я создал диаграмму Ганта с 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;
}
}