Gantt
Source :
1. File Zul :
1.1. gantt_chart.zull
<
vlayout
apply
=
"org.zkoss.bind.BindComposer"
viewModel
=
"@id('vm') @init('demo.chart.gantt.GanttChartVM')"
>
<
chart
id
=
"chart"
width
=
"520"
height
=
"400"
fgAlpha
=
"255"
paneColor
=
"#ffffff"
type
=
"gantt"
model
=
"@bind(vm.model)"
engine
=
"@bind(vm.engine)"
onClick
=
"@command('showMessage',msg=event.areaComponent.tooltiptext)"
/>
<
hlayout
visible
=
"@bind(not empty vm.message)"
>
You clicked on :<
label
value
=
"@bind(vm.message)"
/>
</
hlayout
>
</
vlayout
>
1.2. gantt_chart_ctrl.zull
<
vlayout
apply
=
"org.zkoss.bind.BindComposer"
>
<
radiogroup
onCheck
=
"@global-command('configChanged', category=self.selectedItem.value)"
>
<
vlayout
>
<
radio
label
=
"Both Series"
value
=
"both"
selected
=
"true"
/>
<
radio
label
=
"Scheduled"
value
=
"scheduled"
/>
<
radio
label
=
"Actual"
value
=
"actual"
/>
<
checkbox
label
=
"Percent Complete"
onCheck
=
"@global-command('configChanged', isComplete=self.checked)"
/>
</
vlayout
>
<
groupbox
closable
=
"false"
sclass
=
"z-demo-config"
>
<
caption
label
=
"Theme"
/>
<
hlayout
>
Choose :
<
listbox
id
=
"partSelect"
mold
=
"select"
onSelect
=
"@global-command('configChanged', colorSet=self.selectedItem.value)"
>
<
listitem
label
=
"Customize 1"
value
=
"1"
selected
=
"true"
/>
<
listitem
label
=
"Customize 2"
value
=
"2"
/>
<
listitem
label
=
"Customize 3"
value
=
"3"
/>
</
listbox
>
</
hlayout
>
</
groupbox
>
</
radiogroup
>
</
vlayout
>
2. View Model :
2.1. ganttchartVM.java
package
demo.chart.gantt;
import
org.zkoss.bind.annotation.BindingParam;
import
org.zkoss.bind.annotation.Command;
import
org.zkoss.bind.annotation.GlobalCommand;
import
org.zkoss.bind.annotation.Init;
import
org.zkoss.bind.annotation.NotifyChange;
import
org.zkoss.zul.GanttModel;
public
class
GanttChartVM {
GanttModel model;
GanttChartEngine engine;
String message;
String category;
boolean
complete;
@Init
public
void
init() {
engine =
new
GanttChartEngine();
model = ChartData.getModel(category =
"both"
, complete =
false
);
}
public
GanttChartEngine getEngine() {
return
engine;
}
public
GanttModel getModel() {
return
model;
}
public
String getMessage() {
return
message;
}
@Command
(
"showMessage"
)
@NotifyChange
(
"message"
)
public
void
onShowMessage(
@BindingParam
(
"msg"
) String message){
this
.message = message;
}
@GlobalCommand
(
"configChanged"
)
@NotifyChange
({
"model"
,
"engine"
})
public
void
onConfigChanged(
@BindingParam
(
"category"
) String category,
@BindingParam
(
"isComplete"
) Boolean complete,
@BindingParam
(
"colorSet"
) Integer colorSet){
if
(category!=
null
){
this
.category = category;
}
if
(complete!=
null
){
this
.complete = complete;
}
if
(category!=
null
|| complete!=
null
){
this
.category = category==
null
?
this
.category:category;
this
.complete = complete==
null
?
this
.complete:complete;
model = ChartData.getModel(
this
.category,
this
.complete);
}
if
(colorSet!=
null
){
engine.setColorSet(colorSet);
}
}
}
2.2. ganttchartengine.java
package
demo.chart.gantt;
import
java.awt.Color;
import
org.jfree.chart.JFreeChart;
import
org.jfree.chart.plot.CategoryPlot;
import
org.jfree.chart.renderer.category.GanttRenderer;
import
org.jfree.chart.renderer.category.GradientBarPainter;
import
org.jfree.chart.renderer.category.StandardBarPainter;
import
org.zkoss.zkex.zul.impl.JFreeChartEngine;
import
org.zkoss.zul.Chart;
import
demo.chart.ChartColors;
/*
* you are able to do many advanced chart customization by extending ChartEngine
*/
public
class
GanttChartEngine
extends
JFreeChartEngine {
public
Color task1Color;
public
Color task2Color;
public
Color shadowColor;
public
Color completeColor;
public
Color incompleteColor;
public
boolean
gradientBar =
false
;
public
GanttChartEngine(){
setColorSet(
1
);
}
public
boolean
prepareJFreeChart(JFreeChart jfchart, Chart chart) {
if
(task1Color ==
null
)
return
false
;
CategoryPlot plot = (CategoryPlot) jfchart.getPlot();
GanttRenderer renderer = (GanttRenderer) plot.getRenderer();
renderer.setBarPainter(gradientBar ?
new
GradientBarPainter() :
new
StandardBarPainter());
renderer.setIncompletePaint(incompleteColor);
renderer.setCompletePaint(completeColor);
renderer.setShadowPaint(shadowColor);
renderer.setSeriesPaint(
0
, task1Color);
renderer.setSeriesPaint(
1
, task2Color);
return
false
;
}
public
void
setColorSet(
int
value) {
switch
(value) {
case
1
:
gradientBar =
false
;
task1Color =
new
Color(
0x083643
);
task2Color =
new
Color(
0xB1E001
);
shadowColor =
new
Color(
0x1D3C42
);
completeColor =
new
Color(
0xCEF09D
);
incompleteColor =
new
Color(
0x476C5E
);
break
;
case
2
:
gradientBar =
false
;
task1Color = ChartColors.COLOR_2;
task2Color = ChartColors.COLOR_3;
shadowColor = ChartColors.COLOR_1;
completeColor = ChartColors.COLOR_4;
incompleteColor = ChartColors.COLOR_5;
break
;
case
3
:
gradientBar =
false
;
task1Color =
new
Color(
0xADCF4F
);
task2Color =
new
Color(
0xF2EC99
);
shadowColor =
new
Color(
0x84815B
);
completeColor =
new
Color(
0x4A1A2C
);
incompleteColor =
new
Color(
0x8E3557
);
break
;
case
0
:
default
:
// Default Color
task1Color =
null
;
}
}
}
3. Model :
3.1. ChartData.java
package
demo.chart.gantt;
import
java.util.Calendar;
import
java.util.Date;
import
org.zkoss.zul.GanttModel;
import
org.zkoss.zul.GanttModel.GanttTask;
public
class
ChartData {
public
static
GanttModel getModel(String category,
boolean
complete) {
GanttModel ganttmodel =
new
GanttModel();
int
theYear = Calendar.getInstance().get(Calendar.YEAR);
if
(
"both"
.equals(category) ||
"actual"
.equals(category)) {
ganttmodel.addValue(
"Actual"
,
new
GanttTask(
"Write Proposal"
, date(theYear,
4
,
1
), date(theYear,
4
,
3
), complete ?
1.0
:
0.0
));
ganttmodel.addValue(
"Actual"
,
new
GanttTask(
"Requirements Analysis"
, date(theYear,
4
,
10
), date(theYear,
5
,
15
), complete ?
1.0
:
0.0
));
ganttmodel.addValue(
"Actual"
,
new
GanttTask(
"Design Phase"
, date(theYear,
5
,
15
), date(theYear,
6
,
17
), complete ?
1.0
:
0.0
));
ganttmodel.addValue(
"Actual"
,
new
GanttTask(
"Alpha Implementation"
, date(theYear,
7
,
1
), date(theYear,
9
,
12
), complete ?
0.8
:
0.0
));
ganttmodel.addValue(
"Actual"
,
new
GanttTask(
"Design Review"
, date(theYear,
9
,
12
), date(theYear,
9
,
22
), complete ?
1.0
:
0.0
));
ganttmodel.addValue(
"Actual"
,
new
GanttTask(
"Revised Design Signoff"
, date(theYear,
9
,
25
), date(theYear,
9
,
27
), complete ?
1.0
:
0.0
));
ganttmodel.addValue(
"Actual"
,
new
GanttTask(
"Beta Implementation"
, date(theYear,
8
,
12
), date(theYear,
9
,
12
), complete ?
0.9
:
0.0
));
ganttmodel.addValue(
"Actual"
,
new
GanttTask(
"Testing"
, date(theYear,
10
,
31
), date(theYear,
11
,
17
), complete ?
0.8
:
0.0
));
ganttmodel.addValue(
"Actual"
,
new
GanttTask(
"Final Implementation"
, date(theYear,
11
,
18
), date(theYear,
12
,
5
), complete ?
0.8
:
0.0
));
}
if
(
"both"
.equals(category) ||
"scheduled"
.equals(category)) {
ganttmodel.addValue(
"Scheduled"
,
new
GanttTask(
"Write Proposal"
, date(theYear,
4
,
1
), date(theYear,
4
,
5
),
0.0
));
ganttmodel.addValue(
"Scheduled"
,
new
GanttTask(
"Requirements Analysis"
, date(theYear,
4
,
10
), date(theYear,
5
,
5
),
0.0
));
ganttmodel.addValue(
"Scheduled"
,
new
GanttTask(
"Design Phase"
, date(theYear,
5
,
6
), date(theYear,
5
,
30
),
0.0
));
ganttmodel.addValue(
"Scheduled"
,
new
GanttTask(
"Alpha Implementation"
, date(theYear,
6
,
3
), date(theYear,
7
,
31
),
0.0
));
ganttmodel.addValue(
"Scheduled"
,
new
GanttTask(
"Design Review"
, date(theYear,
8
,
1
), date(theYear,
8
,
8
),
0.0
));
ganttmodel.addValue(
"Scheduled"
,
new
GanttTask(
"Revised Design Signoff"
, date(theYear,
8
,
10
), date(theYear,
8
,
10
),
0.0
));
ganttmodel.addValue(
"Scheduled"
,
new
GanttTask(
"Beta Implementation"
, date(theYear,
8
,
12
), date(theYear,
9
,
12
),
0.0
));
ganttmodel.addValue(
"Scheduled"
,
new
GanttTask(
"Testing"
, date(theYear,
9
,
13
), date(theYear,
10
,
31
),
0.0
));
ganttmodel.addValue(
"Scheduled"
,
new
GanttTask(
"Final Implementation"
, date(theYear,
11
,
1
), date(theYear,
11
,
15
),
0.0
));
}
return
ganttmodel;
}
private
static
Date date(
int
year,
int
month,
int
day) {
final
Calendar calendar = Calendar.getInstance();
calendar.set(year, month -
1
, day);
return
calendar.getTime();
}
}
3.2. ChartColor.java
Hasil :
Reference : https://www.zkoss.org/zkdemo/chart