【问题标题】:How to show information of each task in Gantt chart如何在甘特图中显示每个任务的信息
【发布时间】:2013-03-05 14:52:03
【问题描述】:

我正在使用Jfreechart编写一个分析日志文件的项目,我有一个overvide generateToolTip的问题,我想要做的是当用户将鼠标移动到一个点时,然后 “tip”会显示这个block(一个子任务)的信息,我需要显示每个子任务的描述。

我把我的例子放在这里,我只是可以显示最后一个子任务的描述。

如果可以的话,请给我一些帮助。谢谢

公共类测试 {

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);
        String subTaskDes = null;

        // ArrayList<TaskSeries> ats=new ArrayList<>();
        // TaskSeries ts = new TaskSeries(s);

        int a = tsc.getSeriesCount();
        System.out.println(a + "________________");

        for (int i = 1; i < tsc.getSeriesCount(); i++) {
            TaskSeries ts = tsc.getSeries(i);
            Task task = ts.get(0);
            int count = task.getSubtaskCount();
            for (int j = 0; j < task.getSubtaskCount(); j++) {
                while (count-- != 0) {
                    subTaskDes = task.getSubtask(j).getDescription()
                            .toString();
                }
            }
            // for (int j = 0; j < tsc.getSubIntervalCount(row, col); j++) {
            // tsc.getSeries(0).getTasks().get(0).toString();
            // tsc.getSeries(key)
            // System.out.println(tsc.getSubIntervalCount(row, col));
            // tsc.getColumnKey(i).toString();
            // }
        }

        // System.out.println(ats.get(0).getDescription());

        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();
        return subTaskDes;
    }
}

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 unavailable1 = new TaskSeries("Unavailable 1");
    TaskSeries unavailable2 = new TaskSeries("Unavailable 2");
    TaskSeries unavailable3 = new TaskSeries("Unavailable 3");
    Task t1 = new Task("Meeting Room 1", date(7), date(18));
    t1.addSubtask(new Task("Meeting 1", date(9), date(16)));
    unavailable1.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)));
    unavailable2.add(t2);

    Task t3 = new Task("Meeting Room 3", date(8), date(18));
    t2.addSubtask(new Task("Meeting 7", date(11), date(11)));
    t2.addSubtask(new Task("Meeting 8", date(13), date(15)));
    t2.addSubtask(new Task("Meeting 9", date(18), date(18)));
    unavailable3.add(t3);

    dataset.add(unavailable1);
    dataset.add(unavailable2);
    dataset.add(unavailable3);
    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();
        }
    });
}

}enter code here

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    在调用时,工厂设置IntervalCategoryToolTipGenerator,如here 所示。您可以自定义生成器以查看其他MessageFormat 值是否有用,如here 中的StandardCategoryToolTipGenerator 所示,或者您可以创建一个新的生成器。

    附录:这是在生成器中访问甘特图的TaskSeriesCollection 数据集的示例。对于单个子任务,您可以跟踪索引,如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();
                }
            });
        }
    }
    

    【讨论】:

    • 谢谢,我采纳了你的建议。它运作良好。但我想在“提示”中显示的是对任务的解释。可以给我一个简单的例子来解决这个问题吗?
    • 您可以扩展 IntervalCategoryToolTipGenerator 并覆盖 createItemArraygenerateToolTip 以返回任何内容。由于详细信息取决于您想要什么,请编辑您的问题以包含一个 sscce,以显示您的方法。
    • 好的,我做了一个 sscce,我不确定它是否可以显示我的问题,实际上,我为每个子任务()添加了一个描述,我只想在"提示".eg: new Task("会议室 1", new GregorianCalendar(2009,Month.DECEMBER, 1,7,00).getTime(), new GregorianCalendar(2009,Month.DECEMBER, 1, 18 , 00).getTime());不可用.add(room1);room1.addSubtask(new Task("subMeeting 1", new GregorianCalendar(2009, Month.DECEMBER,1, 9, 00).getTime(), new GregorianCalendar(2009, Month.DECEMBER,1, 16, 00).getTime()));,我希望“subMeeting 1”出现在“tips”中
    • 我的sscce在下面。
    • 如果有人想让每个子任务显示不同的信息,这比垃圾神出色的答案要困难一些。看看这里jfree.org/phpBB2/viewtopic.php?f=3&t=25380 的解决方案(我还没试过)
    【解决方案2】:

    这是我编写的用于提取子任务描述作为工具提示的代码。它为每个子任务提供显示不同的工具提示信息。

    它可能不是最好的编码示例,但它确实有效。您可以进行相应的修改并使用它。

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多