How to show information of each task in Gantt chart

六眼飞鱼酱① 提交于 2019-11-29 15:43:33
trashgod

As invoked, the factory sets a IntervalCategoryToolTipGenerator, as shown here. You can customize the generator to see if the other MessageFormat values are helpful, as shown here for StandardCategoryToolTipGenerator, or you can create a new generator.

Addendum: Here's an example of accessing the Gantt chart's TaskSeriesCollection dataset in the generator. For individual subtasks, you can track the index as shown here.

import java.awt.EventQueue;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.IntervalCategoryToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.IntervalCategoryDataset;
import org.jfree.data.gantt.Task;
import org.jfree.data.gantt.TaskSeries;
import org.jfree.data.gantt.TaskSeriesCollection;

/**
 * @see https://stackoverflow.com/a/15241250/230513
 */
public class Test {

    class MyToolTipGenerator extends IntervalCategoryToolTipGenerator {

        DateFormat format;

        private MyToolTipGenerator(String value, DateFormat format) {
            super(value, format);
            this.format = format;
        }

        @Override
        public String generateToolTip(CategoryDataset cds, int row, int col) {
            final String s = super.generateToolTip(cds, row, col);
            TaskSeriesCollection tsc = (TaskSeriesCollection) cds;
            StringBuilder sb = new StringBuilder(s);
            for (int i = 0; i < tsc.getSubIntervalCount(row, col); i++) {
                sb.append(format.format(tsc.getStartValue(row, col, i)));
                sb.append("-");
                sb.append(format.format(tsc.getEndValue(row, col, i)));
                sb.append(",");
            }
            sb.deleteCharAt(sb.length() - 1);
            return sb.toString();
        }
    }

    private JFreeChart createChart() {
        IntervalCategoryDataset xyDataset = createDataset();
        JFreeChart jFreeChart = ChartFactory.createGanttChart("Gantt",
            "time", "value", xyDataset, true, true, true);
        CategoryPlot plot = jFreeChart.getCategoryPlot();
        plot.getRenderer().setBaseToolTipGenerator(
            new MyToolTipGenerator(
            "{0}, {1}: ", DateFormat.getTimeInstance(DateFormat.SHORT)));
        return jFreeChart;
    }

    private IntervalCategoryDataset createDataset() {
        TaskSeriesCollection dataset = new TaskSeriesCollection();
        TaskSeries unavailable = new TaskSeries("Unavailable");
        Task t1 = new Task("Meeting Room 1", date(7), date(18));
        t1.addSubtask(new Task("Meeting 1", date(9), date(16)));
        unavailable.add(t1);

        Task t2 = new Task("Meeting Room 2", date(8), date(18));
        t2.addSubtask(new Task("Meeting 4", date(10), date(11)));
        t2.addSubtask(new Task("Meeting 5", date(13), date(15)));
        t2.addSubtask(new Task("Meeting 6", date(16), date(18)));
        unavailable.add(t2);
        dataset.add(unavailable);
        return dataset;
    }

    private Date date(int hour) {
        final Calendar calendar = Calendar.getInstance();
        calendar.set(2009, Calendar.DECEMBER, 1, hour, 0, 0);
        return calendar.getTime();
    }

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new ChartPanel(createChart()));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}
Dishan

This is a code I've written to extract the description of sub task as the tool tip. It provides each sub-task displaying different tooltip information.

It could not be the best coding sample but it works. You may modify accordingly and use it.

class MyCategoryToolTipGenerator implements CategoryToolTipGenerator
{
    HashMap<String, List<Task>> subTaskMap;

    public MyCategoryToolTipGenerator()
    {
        subTaskMap = new HashMap<String, List<Task>>();
    }

    @Override
    public String generateToolTip(CategoryDataset categoryDataset, int row, int col )
    {

        TaskSeriesCollection taskSeriesCollection = (TaskSeriesCollection) categoryDataset;

        if ( row >= taskSeriesCollection.getRowCount() )
        {
            return "";
        }
        TaskSeries taskSeries = taskSeriesCollection.getSeries( row );


        if ( col >= taskSeries.getItemCount() )
        {
            return "";
        }
        Task task = taskSeries.get( col );

        //Sub Task tooltip handling//
        if( task.getSubtaskCount() > 0 )
        {
            //Task Key for main task
            String taskKey = "r=" + row + "c=" + col;

            //System.out.println( "Sub Task Count = " + task.getSubtaskCount() + " r=" + row + " c=" + col  );
            List<Task> subTaskList = null;
            if( subTaskMap.containsKey( taskKey ) )
            {
                //If already added, pick the list of available sub tasks
                subTaskList = subTaskMap.get( taskKey );
            }
            else
            {
                //If not found, add all sub tasks to map
                int subTaskCount = task.getSubtaskCount();
                subTaskList = new ArrayList<Task>( subTaskCount );
                for( int i = 0; i < subTaskCount; i++ )
                {
                    //System.out.println("Adding sub task " + task.getSubtask( i ).getDescription());
                    subTaskList.add( task.getSubtask( i ) );
                }
                subTaskMap.put( taskKey, subTaskList );
            }

            if( subTaskList != null && subTaskList.size() > 0 )
            {
                //Take the top most sub task and remove it from list
                Task subTask = subTaskList.remove( 0 );
                //System.out.println("Remove sub task " + subTask.getDescription());

                //If no other sub tasks available remove key from list
                if( subTaskList.size() <= 0 )
                {
                    //System.out.println("Remove Key " + taskKey);
                    subTaskMap.remove( taskKey );
                }

                //Return the top most subtask description
                return subTask.getDescription();
            }
        }

        return task.getDescription();
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!