es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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();
}
Tags:  , ,

Answer

  1. Avatar for 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 de SwingWorker. 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():

    public LaporanPenjualan() {
        initComponents();
        createFrame1();
    }
    
    private void createFrame1() {
        JLabel loading = new JLabel("Cargando, por favor espera.", SwingConstants.CENTER);
        loading.setSize(500,500);
        loading.setAlignmentY(250);
        jPanel1.add(loading); // mostrar mensaje de carga
    
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
                dataset.addValue(34.0, "Ventas/producto", "Pastel Delicioso");
                dataset.addValue(23.0, "Ventas/producto", "Pastel No Tan Delicioso");
                dataset.addValue(54.0, "Ventas/producto", "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);
                jPanel1.revalidate(); // actualizar UI
                jPanel1.repaint();
            }
        });
    }
    

    En este código modificado, eliminamos SwingWorker y creamos un Runnable que carga el gráfico utilizando invokeLater(). 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() y repaint() para asegurarnos de que se muestre correctamente la nueva disposición de los componentes.

Comments are closed.