将按钮插入JFreeChart图表

时间:2015-05-26 14:09:33

标签: java swing charts jfreechart

我使用代码来显示图表。 我想在此图表中显示一个按钮(显示详细信息),我将使用该按钮来呈现图表的一些细节。它是可实现的吗? 谢谢。

if(jCheckBox3.isSelected()) {
    try {
        con = getConnection("jdbc:mysql://localhost:3306/base_rapport","root","");
        Statement statement = con.createStatement(rs.TYPE_FORWARD_ONLY,rs.CONCUR_READ_ONLY);
        String sql3 = "Select Vendor, sum(Rate) as Rate from (select case Vendor when 'NSN' then 'Nokia' else Vendor end as Vendor, Rate from  (  Select vendor ,(count(1) )*100/(Select count(id_incident)from incident where open_time between '"+jTextField1.getText()+"' and'"+jTextField2.getText()+"' and vendor !='') as Rate  from incident   where open_time between '"+jTextField1.getText()+"'and'"+jTextField2.getText()+"' and vendor !='' group by upper(vendor) ) as x ) as y group by vendor";

        rs3 = statement.executeQuery(sql3);
        DefaultPieDataset pieDataset = new DefaultPieDataset(); 

        while(rs3.next()) {      
            pieDataset.setValue( rs3.getString("vendor"),rs3.getDouble(2));
        }

        JFreeChart chart = ChartFactory.createPieChart3D("Disfonctionnement par fournisseurs",  pieDataset, true, true, true); 
        PiePlot3D piePlot3d = (PiePlot3D) chart.getPlot();
        piePlot3d.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}"));
        fenetre fen3 = new fenetre();
        JPanel pnl = new JPanel(new BorderLayout()); 

        fen3.setContentPane(pnl); 
        fen3.setVisible(true);
        fen3.setSize(500, 500); 
        ChartPanel cPanel1 = new ChartPanel(chart);    
        pnl.add(cPanel1);
        File fichier = new File("C:\\Users\\alaeddine.zammeli.st\\Desktop\\résultat_application\\Répartition par fournisseur de '"+jTextField1.getText()+"' à '"+jTextField2.getText()+"'.png");

        try { 
            ChartUtilities.saveChartAsPNG(fichier, chart, 500, 500); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } catch (Exception e) {
        JOptionPane.showMessageDialog(this,e);
    }
}

2 个答案:

答案 0 :(得分:2)

我以前从未这样做过,但原则上ChartPanelJPanel延伸出来。因此,您可以使用setLayout()方法并在图表中添加JButton等组件。

但是,我认为这不是ChartPanel的精神。图表本身不是由JComponent组成的ChartPanel。事实上,来自paintComponent()的{​​{1}}方法(使用Java2D)绘制。因此,如果向面板添加按钮和组件,则无法根据图表正确控制其显示。特别是图表将始终显示在背景中,覆盖面板的整个空间。

我用JFreeCharts做了几次,并且效果很好,是使用弹出菜单。您可以使用ChartPanelgetPopupMenu()setPopupMenu()完全控制弹出菜单中的内容,JFreeCharts的默认菜单已经非常整洁。

或者,您可以在createPopupMenu()容器中的图表旁边或旁边添加JButtons。这是一个example

答案 1 :(得分:2)

ChartMouseListener添加到包含图表的ChartPanel。您可以获取有关所点击的PieSectionEntity的详细信息,如下所示。有关详情,请参阅toString()PieSectionEntity的实施情况。 (可选)您可以突出显示实体here

ChartPanel panel = new ChartPanel(chart);
panel.addChartMouseListener(new ChartMouseListener() {

    @Override
    public void chartMouseClicked(ChartMouseEvent e) {
        ChartEntity entity = e.getEntity();
        if (entity instanceof PieSectionEntity) {
            PieSectionEntity pse = (PieSectionEntity) entity;
            System.out.println(pse);
        }
    }

    @Override
    public void chartMouseMoved(ChartMouseEvent event) {
    }
});