¿Cómo puedo usar JFreeChart
para actualizar dinámicamente la apariencia de un gráfico después de que se ha hecho visible?¿Cómo puedo actualizar el aspecto de un JFreeChart después de que se haya hecho visible?
Respuesta
La clase ChartPanel
es conveniente para esto, ya que tiene métodos para controlar el aspecto general del gráfico, incluidas las propiedades y el estado del zoom. Además, también es posible acceder a los componentes del gráfico, como se muestra a continuación.
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
import javax.swing.AbstractAction;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.time.Year;
import org.jfree.data.xy.XYDataset;
/** @see http://stackoverflow.com/questions/5522575 */
public class ChartPanelDemo {
private static final String title = "Return On Investment";
private ChartPanel chartPanel = createChart();
public ChartPanelDemo() {
JFrame f = new JFrame(title);
f.setTitle(title);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new BorderLayout(0, 5));
f.add(chartPanel, BorderLayout.CENTER);
chartPanel.setMouseWheelEnabled(true);
chartPanel.setHorizontalAxisTrace(true);
chartPanel.setVerticalAxisTrace(true);
JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
panel.add(createTrace());
panel.add(createDate());
panel.add(createZoom());
f.add(panel, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private JComboBox createTrace() {
final JComboBox trace = new JComboBox();
final String[] traceCmds = {"Enable Trace", "Disable Trace"};
trace.setModel(new DefaultComboBoxModel(traceCmds));
trace.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (traceCmds[0].equals(trace.getSelectedItem())) {
chartPanel.setHorizontalAxisTrace(true);
chartPanel.setVerticalAxisTrace(true);
chartPanel.repaint();
} else {
chartPanel.setHorizontalAxisTrace(false);
chartPanel.setVerticalAxisTrace(false);
chartPanel.repaint();
}
}
});
return trace;
}
private JComboBox createDate() {
final JComboBox date = new JComboBox();
final String[] dateCmds = {"Horizontal Dates", "Vertical Dates"};
date.setModel(new DefaultComboBoxModel(dateCmds));
date.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFreeChart chart = chartPanel.getChart();
XYPlot plot = (XYPlot) chart.getPlot();
DateAxis domain = (DateAxis) plot.getDomainAxis();
if (dateCmds[0].equals(date.getSelectedItem())) {
domain.setVerticalTickLabels(false);
} else {
domain.setVerticalTickLabels(true);
}
}
});
return date;
}
private JButton createZoom() {
final JButton auto = new JButton(new AbstractAction("Auto Zoom") {
@Override
public void actionPerformed(ActionEvent e) {
chartPanel.restoreAutoBounds();
}
});
return auto;
}
private ChartPanel createChart() {
XYDataset roiData = createDataset();
JFreeChart chart = ChartFactory.createTimeSeriesChart(
title, "Date", "Value", roiData, true, true, false);
XYPlot plot = chart.getXYPlot();
XYLineAndShapeRenderer renderer =
(XYLineAndShapeRenderer) plot.getRenderer();
renderer.setBaseShapesVisible(true);
NumberFormat currency = NumberFormat.getCurrencyInstance();
currency.setMaximumFractionDigits(0);
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setNumberFormatOverride(currency);
return new ChartPanel(chart);
}
private XYDataset createDataset() {
TimeSeriesCollection tsc = new TimeSeriesCollection();
tsc.addSeries(createSeries("Projected", 200));
tsc.addSeries(createSeries("Actual", 100));
return tsc;
}
private TimeSeries createSeries(String name, double scale) {
TimeSeries series = new TimeSeries(name);
for (int i = 0; i < 6; i++) {
series.add(new Year(2005 + i), Math.pow(2, i) * scale);
}
return series;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ChartPanelDemo cpd = new ChartPanelDemo();
}
});
}
}
Me gusta su tasa de rendimiento. Tendrás que decirnos quién es tu intermediario :) – camickr
@camickr: [Euler] (http://en.wikipedia.org/wiki/Leonhard_Euler) & [Ponzi] (http://en.wikipedia.org/wiki/Ponzi_scheme), LLC! :-) – trashgod
¿Existe un mecanismo equivalente a ChartPanel para proporcionar gráficos interactivos dentro de una aplicación web? –
- 1. ¿Alguien ha hecho crosshairs que siguen el mouse en JFreeChart?
- 2. Agregar servicios después de que se haya construido el contenedor
- 3. ¿Cómo puedo permitir que mi CountDownTimer se restablezca después de que la cuenta regresiva haya finalizado?
- 4. ¿Cómo cambio el tamaño de un Google Map con JavaScript después de que se haya cargado?
- 5. ¿Cómo ejecuto el código DESPUÉS de que se haya cargado un formulario?
- 6. ¿Cómo puedo desactivar javascript temporalmente después de que una página se haya cargado?
- 7. ¿Es posible actualizar el buildpack de una aplicación Heroku después de que se haya creado la aplicación?
- 8. ejecutar el código DESPUÉS de que Recaptcha.reload() haya finalizado
- 9. ¿Cómo puedo cambiar las opciones de un widget de jQuery UI después de que se haya creado?
- 10. ¿Cómo puedo crear un gráfico de barras con JFreeChart, que acorta las barras demasiado largas con una pista visible?
- 11. ¿puedo eliminar un script de shell después de que se haya enviado usando qsub sin afectar el trabajo?
- 12. ¿Cómo puedo esperar que haya terminado el modo interactivo?
- 13. Cómo cerrar automáticamente NERDTree después de que se haya abierto un archivo?
- 14. ¿Cómo detener el seguimiento del enlace hasta después de que se haya completado jQuery .animate?
- 15. ¿Cómo puedo detectar que se haya presionado la tecla Shift?
- 16. JFreeChart: conservar la posición del zoom al actualizar el gráfico
- 17. ¿Cómo obtengo la configuración de Hibernate después de que se haya construido EntityManagerFactory?
- 18. ¿Se está ejecutando el código después de que Rails se haya cargado?
- 19. Recarga dinámicamente UIPageViewController después de que dataSource haya cambiado
- 20. ¿Es posible cambiar los estilos de Google Map después de que se haya inicializado el mapa?
- 21. ¿Cómo puedo cambiar tickLabel en un NumberAxis en JFreeChart?
- 22. Cómo llamar a setUndecorated() después de que un marco se hace visible?
- 23. ¿Puedo volver a iniciar un hilo después de que haya muerto?
- 24. ¿Cómo evito que FormView elimine los valores ingresados del usuario después de que se haya activado el método de inserción?
- 25. ¿EmberJS tiene un evento que se llama después de que se haya actualizado una vista de manubrio?
- 26. ¿cómo puedo verificar que un SqlDataSource haya devuelto datos?
- 27. Ejecución de un proceso Java en Windows incluso después de que el usuario haya cerrado sesión
- 28. Reemplazando el controlador de registro de Devise para permitir una redirección después de que se haya realizado un registro exitoso
- 29. ¿Es posible pasar argumentos a un fragmento después de que se haya agregado a una actividad?
- 30. Llamada de Android de nuevo después de que la representación del diseño se haya completado?
Ver también esta relacionada [ejemplo] (http://stackoverflow.com/a/41544007/230513) que ofrece un 'JToolBar' de botones de zoom. – trashgod