我想使用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。
有没有什么方法可以实现这一点,而不创建额外的JFrame?
不是使用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;
}
}
我将用Netbeans GUI-builder制作的GUI转移到Eclipse。我想知道GUI构建器在代码中输入的这条看起来吓人的消息是否仍然相关:
问题内容: 我有可更新的OHLCChart。我需要在图表上画一条线。 如何执行呢? 问题答案: 如果要在轴上的给定位置绘制垂直或水平线,则可以使用ValueMarker: 如果要绘制水平线,请使用。
我想给图表背景一个透明的外观(不是完全透明但有一点点)。这是我的代码。我添加了几行代码来增加透明度,但我想并没有变得透明。写完这些代码行后,图表backgound显示为灰色。
英文原文:http://emberjs.com/guides/views/inserting-views-in-templates/ 到目前为止,我们已经讨论了如何为单独的视图编写模板。然而,随着应用开发的深入,为了封装页面上的不同区域,你可能会经常需要创建一个层次化的视图结构。每个视图负责处理事件和维护需要显示的属性。 {{view}} 为了将一个子视图添加到父视图中,可以使用{{view}}助
Word显示图像有问题。我真的不知道问题出在哪里