我正在制作一个甘特图,以可视化调度优化结果(n-job和m-machine),并且我想用作业序列标记每个子任务。我应该在哪里实现代码?
在此之前,我已经解决了如何使每项工作具有不同颜色的问题。 (感谢此回复Code for changing the color of subtasks in Gantt Chart),并得出了这个结果(很好) Gantt Chart Result with different color。
,但是现在我停留在如何使每个作业带有标签的上面(不同的颜色很棒,但是如果有标签,它将更好得多,以便读者可以知道要处理哪个作业)。我在代码中看到了有关如何实现此答案(Text labels inside jfree Gantt chart bars)的示例
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Paint;
import java.awt.Rectangle;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Random;
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.labels.IntervalCategoryItemLabelGenerator;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
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;
import org.jfree.ui.TextAnchor;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class GanttAsk extends ApplicationFrame {
public static int Max (int [][] A, int x, int y){
int maxvaltot = 0;
int maxx = 0;
int maxy = 0;
for(int i=0;i<x;i++){if(A[i][y]>maxx){maxx=A[i][y];}}
for(int j=0;j<y;j++){if(A[x][j]>maxy){maxy=A[x][j];}}
if(maxx>=maxy){maxvaltot=maxx;}else{maxvaltot=maxy;}
return maxvaltot;}
private static final long serialVersionUID = 1L;
public static final TaskSeriesCollection model = new TaskSeriesCollection();
private static float [][]Colors = new float [101][3];
Random rand = new Random();
public GanttAsk(final String title) {
super(title);
final IntervalCategoryDataset dataset = createSampleDataset();
// create the chart...
final JFreeChart chart = ChartFactory.createGanttChart(
"Production Scheduling Chart", // chart title
"Machine", // domain axis label
"Hour", // 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(1500));
//CategoryPlot plot2 = (CategoryPlot) chart.getPlot();
// CategoryItemRenderer renderer2 = plot2.getRenderer();
// add the chart to a panel...
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice df = ge.getDefaultScreenDevice();
Rectangle rec = df.getDefaultConfiguration().getBounds();
chartPanel.setLayout(null);
//GanttRenderer personnalisé..
MyRenderer renderer = new MyRenderer(model);
renderer.setBaseItemLabelGenerator( new IntervalCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelPaint(Color.BLACK);
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.BOTTOM_CENTER));
plot.setRenderer(renderer);
//plot.setBackgroundPaint(new Color(128,128,128));
}
/**
* @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;
private int taskCount;
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
taskCount = tasks.get(col).getSubtaskCount();
taskCount = Math.max(1, taskCount);
//System.out.println("----> " + taskCount);
String description;
//System.out.println("test");
for (int i = 0; i < taskCount; i++) {
description = tasks.get(col).getSubtask(i).getDescription();
for(int y=0; y<1000;y++){
if (description.equals(String.valueOf(y))) {clut.add(new Color(Colors[i][0],Colors[i][1],Colors[i][2]));}} }}}
private IntervalCategoryDataset createSampleDataset() {
int[][]Data={{0, 25, 0, 55, 0, 85, 0, 110, 0, 0, 0, 0, 0, 135, 0},
{22, 0, 44, 0, 62, 0, 80, 0, 0, 0, 0, 0, 98, 0, 109},
{0, 0, 0, 120, 131, 0, 142, 143, 144,0,0,25,0,30,0},
{10, 0, 0, 0, 0, 0, 0, 20, 35, 40, 70, 100, 130, 150, 25},
{25, 0, 0, 62, 0, 0, 0, 0, 135, 0, 0, 0, 332, 0, 0}};
int[][]b = new int[Data[1].length][Data.length];
int[][]c = new int[Data[1].length][Data.length];
int[][]s = new int[Data[1].length][Data.length];
for (int i = 0; i < Data.length; i++) {Colors[i][0]= (float) (rand.nextFloat()/ 2f + 0.5);Colors[i][1]= (float) (rand.nextFloat()/ 2f + 0.5);Colors[i][2]= (float) (rand.nextFloat()/ 2f + 0.5);}
int v,w,z;
for(v=0; v<Data[1].length;v++){for(w=0; w<Data.length;w++){b[v][w]=Data[w][v];}}
System.out.println("Transposed");
for(z=0; z<Data[1].length;z++){
System.out.println(Arrays.toString(b[z]));}
for(v=0;v<b.length;v++){for(w=0;w<b[1].length;w++){
System.out.println(v+" - "+w);
if(b[v][w]>0){c[v][w]=b[v][w]+Max(c,v,w);s[v][w]=Max(c,v,w);}}}
System.out.println("Start");
for(z=0; z<Data[1].length;z++){
System.out.println(Arrays.toString(s[z]));}
System.out.println("Finish");
for(z=0; z<Data[1].length;z++){
System.out.println(Arrays.toString(c[z]));}
final TaskSeries s1 = new TaskSeries("");
final Task PA = new Task("Print 2", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PAs = new Task(String.valueOf(z), new SimpleTimePeriod(s[0][z], c[0][z]));
//System.out.println(s[1][z]+" "+ c[1][z]);
PA.addSubtask(PAs);
s1.add(PA);}
final Task PB = new Task("Print 3", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PBs = new Task(String.valueOf(z), new SimpleTimePeriod(s[1][z], c[1][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PB.addSubtask(PBs);
s1.add(PB);}
final Task PC = new Task("Print 5", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PCs = new Task(String.valueOf(z), new SimpleTimePeriod(s[2][z], c[2][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PC.addSubtask(PCs);
s1.add(PC);}
final Task PD = new Task("Lami 2", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PDs = new Task(String.valueOf(z), new SimpleTimePeriod(s[3][z], c[3][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PD.addSubtask(PDs);
s1.add(PD);}
final Task PE = new Task("Lami 4", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PEs = new Task(String.valueOf(z), new SimpleTimePeriod(s[4][z], c[4][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PE.addSubtask(PEs);
s1.add(PE);}
final Task PF = new Task("Lami 6", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PFs = new Task(String.valueOf(z), new SimpleTimePeriod(s[5][z], c[5][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PF.addSubtask(PFs);
s1.add(PF);}
final Task PG = new Task("Lami 7", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PGs = new Task(String.valueOf(z), new SimpleTimePeriod(s[6][z], c[6][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PG.addSubtask(PGs);
s1.add(PG);}
final Task PH = new Task("Slit 1", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PHs = new Task(String.valueOf(z), new SimpleTimePeriod(s[7][z], c[7][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PH.addSubtask(PHs);
s1.add(PH);}
final Task PI = new Task("Slit 3", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PIs = new Task(String.valueOf(z), new SimpleTimePeriod(s[8][z], c[8][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PI.addSubtask(PIs);
s1.add(PI);}
final Task PJ = new Task("Slit 6", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PJs = new Task(String.valueOf(z), new SimpleTimePeriod(s[9][z], c[9][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PJ.addSubtask(PJs);
s1.add(PJ);}
final Task PK = new Task("Slit 7", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PKs = new Task(String.valueOf(z), new SimpleTimePeriod(s[10][z], c[10][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PK.addSubtask(PKs);
s1.add(PK);}
final Task PL = new Task("Slit 8", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PLs = new Task(String.valueOf(z), new SimpleTimePeriod(s[11][z], c[11][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PL.addSubtask(PLs);
s1.add(PL);}
final Task PM = new Task("BM 1", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PMs = new Task(String.valueOf(z), new SimpleTimePeriod(s[12][z], c[12][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PM.addSubtask(PMs);
s1.add(PM);}
final Task PN = new Task("BM 5", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task PNs = new Task(String.valueOf(z), new SimpleTimePeriod(s[13][z], c[13][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PN.addSubtask(PNs);
s1.add(PN);}
final Task PO = new Task("BM 6", new SimpleTimePeriod(0, 1500));
for(z=0;z<c[1].length;z++){
final Task POs = new Task(String.valueOf(z), new SimpleTimePeriod(s[14][z], c[14][z]));
// System.out.println(s[1][z]+" "+ c[1][z]);
PO.addSubtask(POs);
s1.add(PO);}
model.add(s1);
return model;
}
public static void main(final String[] args) {
final GanttAsk demo = new GanttAsk("Production Scheduling");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
}
实际上我已经尝试从(Text labels inside jfree Gantt chart bars)实现答案,但是它没有显示标签,并且使所有颜色再次变为相同(红色)。因此,有人可以指导我如何实现这些代码吗?我是Java GUI和JFreeChart的初学者。