如何在单独的GUI上的面板中插入JFreeChart图表?

我想使用JFreeChart将图表放在GUI中的特定面板中。 我有2个java文件(一个用于GUI,另一个用于创建图形),并且如果可能的话,希望保持这种方式。

在主GUI中我有一个名为panelGraph的面板:

JPanel panelGraph = new JPanel(); panelGraph.setBounds(220, 64, 329, 250); panelMain.add(panelGraph); //it is inside the main panel panelGraph.setLayout(null); 

而且我还有一个触发图形外观的按钮:

  Button btnGetGraph = new JButton("Draw Graph"); btnGetGraph.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { XYLineChart_AWT.runGraph("Cenas", "Titulo", "XLABEL", "YLABEL", panelGraph); } }); btnGetGraph.setFont(new Font("Tahoma", Font.BOLD, 13)); btnGetGraph.setBounds(323, 327, 128, 34); panelMain.add(btnGetGraph); 

如下所示,是创建图形的java文件:

  public class XYLineChart_AWT extends JFrame { public XYLineChart_AWT( String applicationTitle, String chartTitle, String xLabel, String yLabel, JPanel panel) { JFreeChart xylineChart = ChartFactory.createXYLineChart( chartTitle , xLabel , yLabel , createDataset() , PlotOrientation.VERTICAL , true , false , false); ChartPanel chartPanel = new ChartPanel( xylineChart ); chartPanel.setPreferredSize( panel.getSize() ); final XYPlot plot = xylineChart.getXYPlot( ); plot.setBackgroundPaint(new Color(240, 240, 240)); XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true,false); renderer.setSeriesPaint( 0 , Color.BLACK ); renderer.setSeriesStroke( 0 , new BasicStroke( 4.0f ) ); plot.setRenderer( renderer ); setContentPane(chartPanel); panel.add(chartPanel); } private XYDataset createDataset( ){ final XYSeries seno = new XYSeries ("Sin"); for(double i=0;i<=1440;i++){ double temp=Math.sin(i*((2*Math.PI)/640) + Math.PI) + 1; seno.add(i/60, temp); } final XYSeriesCollection dataset = new XYSeriesCollection( ); dataset.addSeries(seno); return dataset; } public static void runGraph(String appTitle, String chartTitle, String xLabel, String yLabel, JPanel panel) { XYLineChart_AWT chart = new XYLineChart_AWT(appTitle, chartTitle, xLabel, yLabel, panel); chart.pack(); chart.setVisible(true); panel.setVisible(true); } } 

这将创建图形并将其放入指定的面板(我通过方法runGraph()发送)。 但是,它创建了第二个JFrame(我知道我创建了chart.setVisible(true),我可以把它设置为false),我不希望在我发送的面板之外创建它。

有没有办法实现这个不创建额外的jFrame?

PS:另一个问题:setBackgroundPaint()方法改变了图形显示的背面。 但是标题和图例的部分不会改变。 我该如何更改这些部件?

谢谢您的帮助,

Nhekas

而不是使用XYLineChartAWT构造函数来实例化ChartPanel ,使runGraph()成为一个工厂方法,返回一个JFreeChart ,以便在主GUI的ChartPanel 。 使用图表面板方法setChart() ,它将自动更新面板。 要更改图表面板的默认大小,请覆盖此处所示的getPreferredSize()

图片

 import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.EventQueue; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; /** * @see https://stackoverflow.com/a/36757609/230513 */ public class Test { private void display() { JFrame f = new JFrame("Test"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final ChartPanel chartPanel = new ChartPanel(null); f.add(chartPanel); f.add(new JButton(new AbstractAction("Draw Graph") { @Override public void actionPerformed(ActionEvent e) { chartPanel.setChart( new XYLineChartAWT().runGraph("Title", "X", "Y")); } }), BorderLayout.SOUTH); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Test()::display); } } public class XYLineChartAWT { public JFreeChart runGraph(String chartTitle, String xLabel, String yLabel) { JFreeChart xylineChart = ChartFactory.createXYLineChart( chartTitle, xLabel, yLabel, createDataset(), PlotOrientation.VERTICAL, true, false, false); final XYPlot plot = xylineChart.getXYPlot(); plot.setBackgroundPaint(new Color(240, 240, 240)); XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, false); renderer.setSeriesPaint(0, Color.BLACK); renderer.setSeriesStroke(0, new BasicStroke(4.0f)); plot.setRenderer(renderer); return xylineChart; } private XYDataset createDataset() { final XYSeries seno = new XYSeries("Sin"); for (double i = 0; i <= 1440; i++) { double temp = Math.sin(i * ((2 * Math.PI) / 640) + Math.PI) + 1; seno.add(i / 60, temp); } final XYSeriesCollection dataset = new XYSeriesCollection(); dataset.addSeries(seno); return dataset; } }