二.定制图纸
我们希望通过资源表的外观实现的目标是对单元格背景进行选择性着色,这可以通过自定义绘图来完成。自定义绘图为我们提供了根据视图为日历的大多数元素着色的方法。“自定义绘制元素”示例为我们提供了与CustomDrawElements枚举相对应的元素的可视表示形式,该枚举确定了在时间表中要自定义绘制的内容:
该示例可从以下链接获得:
Java Swing Scheduler:根据“日历”视图演示自定义绘图元素的示例
我们要为资源标头和与此资源相对应的单元格上色。因此,我们使用setCustomDraw方法来实现这一点:
calendar.setCustomDraw(EnumSet.of(CustomDrawElements.ResourceViewRowHeader, CustomDrawElements.ResourceViewCellComplete));
CustomDrawElements枚举的成员允许按位组合。绘制在draw事件的事件处理程序中完成:
calendar.addCalendarListener(new CalendarAdapter() {
public void draw(CalendarDrawEvent e) {
onCalendarDraw(e);
}
});
我们使用CalendarAdapter订阅draw事件,该事件由onCalendarDraw方法处理。该CalendarDrawEvent类暴露许多属性,让我们关于正在绘制的元素信息。我们使用getElement方法检查正在绘制的元素是单元格还是标题。如果是单元格,则获取与其对应的资源;如果它是正确的单元格,则绘制一个矩形,该矩形表示当前绘制的元素的整个区域。我们用getBounds方法得到它:
if (e.getElement() == CustomDrawElements.ResourceViewCellComplete)
{
Rectangle bounds = new Rectangle(e.getBounds());
bounds.x += 1;
if (e.getResource().getId().equals(“IdMike”) ||
e.getResource().getId().equals(“IdChuck”) ||
e.getResource().getId().equals(“IdTom”) ||
e.getResource().getId().equals(“IdAlfredo”))
{
g.fillRectangle(_brush3, bounds);
g.drawString(“Office”, _font, _textBrush, bounds, f);
}
我们将在与同一资源相对应的资源标头上绘制一个轮廓,并用_brush3为其行着色:
else if (e.getElement() == CustomDrawElements.ResourceViewRowHeader)
{
if (e.getResource().getId().equals(“IdMike”) ||
e.getResource().getId().equals(“IdChuck”) ||
e.getResource().getId().equals(“IdTom”) ||
e.getResource().getId().equals(“IdAlfredo”))
{
Brush _brush3 = new SolidBrush(new Color(254, 249, 207, 100));
g.fillRectangle(_brush3, e.getBounds());
g.drawRectangle(new Pen(new Color(163, 198, 134, 255), 2),
e.getBounds().getMinX() + 1,
e.getBounds().getMinY() + 1,
e.getBounds().getMaxX() - 2,
e.getBounds().getMaxY() - 2);
}
}
在这里,我们检查,如果自定义绘制元素是CustomDrawElements的CalendarDrawEvent类,这为事件提供数据给了我们足够的信息来识别正在绘制的确切元素。
三,所选资源的工具提示
默认情况下,日历提供项目的工具提示。该ItemTooltipEvent提供更多这方面的信息。但是,当用户将鼠标悬停在与我们在第二节中绘制的元素相对应的单元格上方时,我们希望显示工具提示。我们可以通过使用MouseMotionListener并订阅mouseMove事件来实现。请注意,这些是标准的Java Swing事件:
calendar.addMouseMotionListener(new MouseAdapter() {
public void mouseMoved(MouseEvent e) {
onCalendarMouseMoved(e);
}
});
在事件处理程序方法中,我们使用Calendar的getResourceAt方法来学习鼠标悬停在其上的资源。然后,我们使用分配给资源的id-s,并检查鼠标是否位于我们要呈现工具提示的资源上:
private void onCalendarMouseMoved(MouseEvent e) {
Resource res = calendar.getResourceAt(e.getX(), e.getY());
if (res.getId().equals("IdMike") ||
res.getId().equals("IdChuck") ||
res.getId().equals("IdTom") ||
res.getId().equals("IdAlfredo"))
{
calendar.setToolTipText(res.getId());
}
else
{
calendar.setToolTipText("");
}
}
当我们检测到鼠标悬停在不需要呈现工具提示的资源上时,我们将收费提示文本设置为空字符串。
至此,我们完成了自定义资源样本。