No se puede cargar un hilo que carga un gráfico de JFreeChart hasta que se hace clic en él.
Creo que hice todo correctamente. Todo lo que quiero es cargar el hilo que contiene el gráfico después de que el hilo principal que carga los componentes y la ventana haya terminado. Pero no funcionó. De alguna manera tengo que hacer clic en jPanel1 (el panel que cargará el gráfico) y el gráfico se carga. Cualquier ayuda sería apreciada. Lo que intenté:
- Cambiar el hilo a SwingWorker
- Cambiar el hilo a invokeLater
public LaporanPenjualan() {
initComponents();
createFrame1();
}
private void createFrame1() {
SwingWorker thread = new SwingWorker() {
@Override
protected Boolean doInBackground() throws Exception {
JLabel loading = new JLabel("Cargando, por favor espere",SwingConstants.CENTER);
loading.setSize(500,500);
loading.setAlignmentY(250);
jPanel1.add(loading);
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(34.0, "Ventas/productos", "Pastel Delicioso");
dataset.addValue(23.0, "Ventas/productos", "Pastel No Tan Delicioso");
dataset.addValue(54.0, "Ventas/productos", "Pastel Sultan");
final JFreeChart chart = ChartFactory.createBarChart(
"",
"Producto",
"Ventas",
dataset,
PlotOrientation.VERTICAL,
true,
true,
false
);
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setSize(500,500);
chartPanel.setPreferredSize(new Dimension(300, 300));
jPanel1.removeAll();
jPanel1.add(chartPanel);
chartPanel.setVisible(true);
return true;
}
};
thread.execute();
}
davy.ai
Parece que el problema está relacionado con el momento en que se carga el gráfico. Es posible que el hilo para cargar el gráfico se esté ejecutando antes del hilo principal que carga los componentes y la ventana.
Un enfoque para resolver este problema es usar el método
SwingUtilities.invokeLater()
en lugar deSwingWorker
. Este método garantiza que el código se ejecute en el hilo de dispatcher de eventos, que es responsable de manejar eventos como interacciones del usuario y actualizaciones de componentes.Aquí tienes un ejemplo de cómo modificar el código usando
invokeLater()
:En este código modificado, eliminamos
SwingWorker
y creamos unRunnable
que carga el gráfico utilizandoinvokeLater()
. Esto garantiza que el gráfico se cargue después de que el hilo principal termine de cargar los componentes y la ventana.También eliminamos el mensaje de carga después de que se haya cargado el gráfico, y actualizamos la UI con
revalidate()
yrepaint()
para asegurarnos de que se muestre correctamente la nueva disposición de los componentes.