這段時間一直比較忙,答應幫朋友完善的一個RCP畢業設計,直到這兩天才有時間動手。這個RCP有生成報表的需求,首先想到的是JFreeChart和BIRT的Chart引擎。因為對JFreeChart比較熟悉,就選擇用它做報表。
ChartView.java創建一個View類,這里JFreeChart報表參考了SWTTimeSeriesDemo,當然之前得首先加入jfreechart-1.0.5.jar、jfreechart-1.0.5-swt.jar和jcommon1.0.9.jar。

/** *//**
* @author zyh2k
*
*/

public class ChartView extends ViewPart
{
private ChartComposite frame;


/**//* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
@Override

public void createPartControl(Composite parent)
{
// TODO Auto-generated method stub

final JFreeChart chart = createChart(createDataset());

/**//*final Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(600, 300);
shell.setLayout(new FillLayout());
shell.setText("Time series demo for jfreechart running with SWT");*/
frame = new ChartComposite(parent, SWT.NONE, chart, true);
FillLayout fillLayout = new FillLayout();
fillLayout.type = SWT.VERTICAL;
frame.setLayout(fillLayout);
frame.setSize(600, 300);
frame.setDisplayToolTips(true);
frame.setHorizontalAxisTrace(false);
frame.setVerticalAxisTrace(false);

/**//*shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}*/

}

/** *//**
* 用戶退出時,將面板隱藏
*/

public void logoff()
{
if (frame != null && !frame.isDisposed())
frame.setVisible(false);
}

/** *//**
* 顯示面板內容
*/

public void show()
{
if (frame != null && !frame.isDisposed())
frame.setVisible(true);
}


/**//* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
@Override

public void setFocus()
{
// TODO Auto-generated method stub

}

/** *//**
* Creates a chart.
*
* @param dataset a dataset.
*
* @return A chart.
*/

private static JFreeChart createChart(XYDataset dataset)
{

JFreeChart chart = ChartFactory.createTimeSeriesChart(
"宿舍水電費月報表", // title
"日期", // x-axis label
"費用", // y-axis label
dataset, // data
true, // create legend?
true, // generate tooltips?
false // generate URLs?
);

chart.setBackgroundPaint(Color.white);

XYPlot plot = (XYPlot) chart.getPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
plot.setDomainCrosshairVisible(true);
plot.setRangeCrosshairVisible(true);
XYItemRenderer r = plot.getRenderer();

if (r instanceof XYLineAndShapeRenderer)
{
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
renderer.setBaseShapesVisible(true);
renderer.setBaseShapesFilled(true);
}
DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));
return chart;

}

/** *//**
* Creates a dataset, consisting of two series of monthly data.
*
* @return The dataset.
*/

private static XYDataset createDataset()
{
TimeSeriesCollection dataset = new TimeSeriesCollection();
DbOperate db = DwesFactory.getDbOperate();
List rooms = db.getRoomAll();
List datas = db.getScoreAll();

for (Iterator iter = rooms.iterator(); iter.hasNext();)
{
String room = (String) iter.next();
TimeSeries roomSeries = new TimeSeries(room, Month.class);

for (Iterator dataIter = datas.iterator(); dataIter.hasNext();)
{
Score score = (Score) dataIter.next();

if(score.getName().equals(room))
{
int[] dataObj = DateUtils.getNowSingleObject(score.getMonth());
roomSeries.add(new Month(dataObj[1], dataObj[2]), score.getScore());
}
}
dataset.addSeries(roomSeries);
}
return dataset;
}

}
NavigatorView.java調用ChartView

/** *//**
* 結點雙擊事件
*/

private class MyDoubleClickListener implements IDoubleClickListener
{

public void doubleClick(DoubleClickEvent event)
{
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
NavigatorEntry entry = (NavigatorEntry) sel.getFirstElement();
// 取得IWorkbenchPage
IWorkbenchPage workbenchPage = getViewSite().getPage();

if(entry.getName().equals("報表輸出"))
{
String viewId = ChartView.class.getName();
ChartView view;

try
{
view = (ChartView) workbenchPage.showView(viewId);
view.show();//顯示面板內容

} catch (PartInitException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

} else
{
IEditorInput editorInput = entry.getEditorInput();
String editorID = entry.getEditorId();
// 如果editorInput或editorID為空則中斷返回
if (editorInput == null || editorID == null)
return;
//搜索使用editorInput對象對應的編輯器
IEditorPart editor = workbenchPage.findEditor(editorInput);
// 如果此編輯器已經存在,則將它設為當前編輯器,否則重新打開一個編輯器。

if (editor != null)
{
workbenchPage.bringToTop(editor);

} else
{

try
{
editor = workbenchPage.openEditor(editorInput, editorID);

} catch (PartInitException e2)
{
e2.printStackTrace();
}
}
}
}
}
plugin.xml
<!-- 加入視圖 -->
<view
name="報表視圖"
icon="icons/project.gif"
category="cn.com.wen.dwes.view"
class="cn.com.wen.dwes.archive.ChartView"
id="cn.com.wen.dwes.archive.ChartView">
</view>
</extension>
MANIFEST.MF加入引用的包
Bundle-ClassPath: dwes.jar,
lib/mysql-connector-java-5.0.3-bin.jar,
lib/jcommon-1.0.9.jar,
lib/jfreechart-1.0.5.jar,
lib/jfreechart-1.0.5-swt.jar
運行的效果

運行時把鼠標可以報表上左右拖動或選擇一個區域放大,有點像BIRO報表的向下鉆取。由于SWT的JFreeChart目前還是experimental,想把它運用在商業化項目的朋友慎重考慮。
posted on 2007-06-07 10:03
凍僵的魚 閱讀(3200)
評論(1) 編輯 收藏