java - 如何在甘特图中显示每个任务的信息

标签 java jfreechart

我正在使用Jfreechart编写一个分析日志文件的项目,我有一个覆盖generateToolTip的问题,我想做的是当用户将鼠标移动到一个条形的一个点时,然后 “提示”将显示该 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();
        }
    });
}

}在此处输入代码

最佳答案

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

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

关于java - 如何在甘特图中显示每个任务的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15226853/

相关文章:

java - JFreeChart - 创建移动图表时出现问题

java - 性能问题 - JFreeChart (XYDataSet)

java - 设置jfreechart x轴上的时间

Java:如何有效地从数据库中读取?

java - ArrayList 重用单个对象,而不是创建新对象

java - ADF 应用程序部署两次以运行

java - 改变jfreechart饼图的颜色

java - JFreeChart - 将图表转换为 PDF,每页一个

java - Android:如何使应用程序使用 Activity 低于 API 级别 21?

java - JAVA 8 中的 NULL 安全对象检查