Este ejemplo nos proponemos a demostrar gráficamente la rica conducta caótica de una ecuación demográfica interada.
Para ello necesitamos que la gráfica se vaya actualizando automáticamente a medida que vayamos modificando los distintos valores de entrada de la ecuación.
Empezamos por crear un nuevo proyecto de tipo JFrame y en modo de diseño le agregamos un jPanel para mostrar la gráfica. También añadimos 4 jSpinner con sus correspondientes jLabels y un jButton para restablecer las entradas a valores predeterminados.
Debería quedar algo parecido a eso:
Código:
package freejchartpanel1;
import javax.swing.JOptionPane;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class Ventana1 extends javax.swing.JFrame {
public double k;
public double poblacion;
public double tasaNatalidad;
public int generaciones;
public Ventana1() {
initComponents();
restablecer();
actualizar();
}
private void initComponents() { ... }// Aquí va código generado por Netbeans
private void jSpinnerPoblacionInicialStateChanged(javax.swing.event.ChangeEvent evt) {
actualizar();
ejecutar();
}
private void jSpinnerCapacidadCargaStateChanged(javax.swing.event.ChangeEvent evt) {
actualizar();
ejecutar();
}
private void jSpinnerNatalidadStateChanged(javax.swing.event.ChangeEvent evt) {
actualizar();
ejecutar();
}
private void jSpinnerGeneracionesStateChanged(javax.swing.event.ChangeEvent evt) {
actualizar();
ejecutar();
}
private void jButtonRestablecerActionPerformed(java.awt.event.ActionEvent evt) {
restablecer();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Ventana1().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonRestablecer;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JSpinner jSpinnerCapacidadCarga;
private javax.swing.JSpinner jSpinnerGeneraciones;
private javax.swing.JSpinner jSpinnerNatalidad;
private javax.swing.JSpinner jSpinnerPoblacionInicial;
// End of variables declaration
private void actualizar() {
k = Double.parseDouble(jSpinnerCapacidadCarga.getValue().toString());
poblacion = Double.parseDouble(jSpinnerPoblacionInicial.getValue().toString());
tasaNatalidad = Double.parseDouble(jSpinnerNatalidad.getValue().toString()) / 100;
generaciones = Integer.parseInt(jSpinnerGeneraciones.getValue().toString());
// Control rango maximos minimos jSpinners
if (k <= 1) {
jSpinnerCapacidadCarga.setValue(1);
} else if (poblacion >= k) {
jSpinnerPoblacionInicial.setValue(k);
} else if (poblacion <= 1) {
jSpinnerPoblacionInicial.setValue(1);
} else if (tasaNatalidad <= 0) {
jSpinnerNatalidad.setValue(0);
} else if (generaciones <= 0) {
jSpinnerGeneraciones.setValue(0);
}
}
private void restablecer() {
jSpinnerCapacidadCarga.setValue(10000);
jSpinnerPoblacionInicial.setValue(7000);
jSpinnerNatalidad.setValue(120); // %
jSpinnerGeneraciones.setValue(30);
}
private void ejecutar() {
int extincion = 0;
XYSeries series = new XYSeries("");
for (int i = 0; i < generaciones; i++) {
series.add(i, poblacion);
poblacion = (poblacion * tasaNatalidad * (k - poblacion)) / k;
if (poblacion <= 0) {
extincion = i + 1;
series.add(i + 1, 0);
break;
}
}
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(series);
JFreeChart chart = ChartFactory.createXYLineChart(
"Índice Demográfico",
"Generación ->",
"Población ->",
dataset,
PlotOrientation.VERTICAL,
false,
false,
false
);
// Mostramos la grafica dentro del jPanel1
ChartPanel panel = new ChartPanel(chart);
jPanel1.removeAll();
jPanel1.setLayout(new java.awt.BorderLayout());
jPanel1.add(panel);
jPanel1.validate();
if (extincion != 0) {
JOptionPane.showMessageDialog(null, "Extinción en la Generación " + (extincion));
}
}
}
Resultado:
Una forma sencilla y rápida de aprender JAVA, observando y deduciendo cómo se comporta el lenguaje a través de ejemplos prácticos.
Archivo del blog
Suscribirse a:
Enviar comentarios (Atom)
Con la tecnología de Blogger.
No hay comentarios:
Publicar un comentario