Java甘特图的实现方案

简介

甘特图(Gantt Chart)是一种项目进度管理工具,它以时间为横轴,任务为纵轴,使用条状图表示任务的开始和结束时间,帮助项目团队可视化项目进度。本文将介绍如何使用Java实现一个简单的甘特图。

实现思路

为了实现甘特图,我们需要以下几个步骤:

  1. 确定任务的开始和结束时间
  2. 绘制甘特图的条状图
  3. 添加任务标签和时间轴

下面将详细介绍每个步骤的实现方法。

实现步骤

1. 确定任务的开始和结束时间

首先,我们需要定义一个任务类,该类包含任务的名称、开始时间和结束时间属性。例如:

public class Task {
    private String name;
    private Date startTime;
    private Date endTime;

    // 构造函数和getter/setter方法省略...
}

在实际应用中,可以根据需求从数据库或其他来源获取任务的开始和结束时间。

2. 绘制甘特图的条状图

接下来,我们使用Java图形库(如Swing)来绘制甘特图的条状图。首先,我们创建一个继承自JPanel的自定义面板类,用于绘制甘特图的条状图。例如:

public class GanttChartPanel extends JPanel {
    private List<Task> tasks;

    public GanttChartPanel(List<Task> tasks) {
        this.tasks = tasks;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        // 绘制任务条状图
        for (int i = 0; i < tasks.size(); i++) {
            Task task = tasks.get(i);
            int startX = calculateX(task.getStartTime());
            int endX = calculateX(task.getEndTime());
            int y = calculateY(i);

            g.setColor(Color.BLUE);
            g.fillRect(startX, y, endX - startX, 10);
        }
    }

    private int calculateX(Date date) {
        // 根据日期计算X坐标,略
    }

    private int calculateY(int index) {
        // 根据任务索引计算Y坐标,略
    }
}

paintComponent方法中,我们遍历所有任务,并根据任务的开始和结束时间计算出任务在图中的起始和结束X坐标,然后绘制蓝色的矩形表示任务。

3. 添加任务标签和时间轴

最后,我们在甘特图中添加任务标签和时间轴。我们可以使用JLabel和JScrollPane来实现这个功能。例如:

public class GanttChartFrame extends JFrame {
    private List<Task> tasks;
    private GanttChartPanel ganttChartPanel;
    private JScrollPane scrollPane;

    public GanttChartFrame(List<Task> tasks) {
        this.tasks = tasks;
        this.ganttChartPanel = new GanttChartPanel(tasks);
        this.scrollPane = new JScrollPane(ganttChartPanel);

        setupUI();
    }

    private void setupUI() {
        // 设置窗口大小和布局,略

        // 添加任务标签
        for (int i = 0; i < tasks.size(); i++) {
            Task task = tasks.get(i);
            JLabel label = new JLabel(task.getName());
            label.setBounds(10, calculateY(i) + 5, 100, 20);
            add(label);
        }

        // 添加时间轴
        JLabel timeLabel = new JLabel("时间轴");
        timeLabel.setBounds(10, calculateY(tasks.size()) + 30, 100, 20);
        add(timeLabel);

        // 添加甘特图面板
        scrollPane.setBounds(120, 10, getWidth() - 130, getHeight() - 50);
        add(scrollPane);
    }

    private int calculateY(int index) {
        // 根据任务索引计算Y坐标,略
    }
}

setupUI方法中,我们遍历所有任务,创建一个JLabel来显示任务的名称,并根据任务索引计算出Y坐标。然后,我们创建一个JLabel来显示时间轴,并设置其位置。最后,我们将甘特图面板添加到JScrollPane中,并设置ScrollPane的位置和大小。

使用示例

public class GanttChartExample {
    public static void main(String[] args)