JfreeChart Gantt图表上的子任务标签实现

时间:2019-08-05 16:13:53

标签: java jfreechart gantt-chart

我正在制作一个甘特图,以可视化调度优化结果(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的初学者。

0 个答案:

没有答案
相关问题