How to show information of each task in Gantt chart

前端 未结 2 1129

i am using Jfreechart to write a projet of analysing log file, i have a problem of overvide generateToolTip ,what i want to do is when the user move his mouse to a point of

相关标签:
2条回答
  • 2020-12-21 12:10

    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();
        }
    }
    
    0 讨论(0)
  • 2020-12-21 12:18

    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.

    image

    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();
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题