白日不到处,青春恰自来。
苔花如米小,亦学牡丹开。
posts - 4,  comments - 34,  trackbacks - 0

     这段时间一直比较忙,答应帮朋友完善的一个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(
600300);
            
            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.05.05.05.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 冻僵的鱼 阅读(3179) 评论(1)  编辑  收藏

FeedBack:
# re: 在Eclipse RCP中使用JFreeChart报表
2008-05-09 17:35 | jll
能不能给我JreeChart的包?最好附上安装步骤.谢谢!我自己下了一个,但好像不起作用.我的邮箱是jianglili29@126.com  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(3)

随笔档案(4)

相册

搜索

  •  

积分与排名

  • 积分 - 13901
  • 排名 - 2054

最新评论

阅读排行榜

评论排行榜