JFrame no responde a eventos mientras maneja otro evento

Tengo el siguiente escenario: 1. Creé un JFrame jFrame en una clase "FrontEnd.java" que implementa ActionListener . Luego agrego un objeto Canvas3D a su ContentPane , y luego, agrego un JMenuBar con algunos JMenus y un par de JMenuItems cada uno. 2. Luego tengo una clase RendererClass.java que uso para representar esferas en el objeto Canvas3D. Entonces, desde FrontEnd , haciendo clic en uno de los JMenuItems, manejo el evento y desde actionPerformedMétodo (ActionEvent ae) Llamo RendererClass (jFrame) y obtengo el objeto jFrame del lado del Renderer, y entonces Canvas3D pinta las esferas en él. Entonces, los pinto en sus posiciones iniciales. 3. Luego, actualizo las coordenadas de las esferas en un bucle sentado en FrontEnd , que llama "updateCoordinates ()" que está en RendererClass. Este es un ciclo pesado que puede durar hasta un minuto. Al actualizar las coordenadas de la esfera, muestro cómo se actualizan en el Canvas3D (en cada iteración, las coordenadas varían ligeramente): esto se realiza mediante updateCoordinates () en RendererClass.

El problema es que, mientras estoy en el bucle, que se llamó desde el método actionPerformed (...), no puedo interactuar con el jFrame, no cerrar el evento. En realidad, está escuchando, porque cuando finaliza el ciclo, si hago clic en "X" (Cerrar ventana), la ventana se cierra. Además, si intenté rotar mi cámara en el Canvas3D, no actualizará la rotación hasta que el ciclo haya terminado. Observe que mientras estoy en el bucle, veo mis esferas moviéndose. Además, los botones dejan de responder y ya no responden: los elementos desplegables de JMenuItems parecen ubicarse debajo de Canvas3D y se vuelven inaccesibles.

Aquí está el código:

public class FrontEnd implements ActionListener {

    /**
     * The main Window and menus
     */
    private static JFrame jFrame = null;
    private JMenuBar jMenuBar;
    private JMenu fileMenu;
    private JMenu editMenu;
    private JMenu aboutMenu;

    private JMenuItem openAction;
    private JMenuItem exitAction;
    private JMenuItem renderAction;
    private JMenuItem aboutAction;

    /**
     * The renderer
     */
    private RendererClass renderer = null;

    /**
     * Constructor
     *
     */
    public FrontEnd() {

        jFrame = new JFrame("The Main Window");
        jFrame.getContentPane().add(new     Canvas3D(SimpleUniverse.getPreferredConfiguration()));

        jFrame.setPreferredSize(new Dimension(800, 600));
        jFrame.setResizable(false);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        /**
         * Menus
         */
        jMenuBar = new JMenuBar();
        jFrame.setJMenuBar(jMenuBar);

        //Dropdown menus
        fileMenu = new JMenu("File");
        editMenu = new JMenu("Edit");
        aboutMenu = new JMenu("About");
        jMenuBar.add(fileMenu);
        jMenuBar.add(editMenu);
        jMenuBar.add(aboutMenu);

        //Create and add simple menu item to one of the drop down menu
        openAction = new JMenuItem("Open");
        openAction.setMnemonic('O');
        exitAction = new JMenuItem("Exit");
        exitAction.setMnemonic('x');
        renderAction = new JMenuItem("Render All");
        renderAction.setMnemonic('R');
        aboutAction = new JMenuItem("About");
        aboutAction.setMnemonic('A');

        fileMenu.add(openAction);
        fileMenu.add(exitAction);
        editMenu.add(renderAction);
        aboutMenu.add(aboutAction);

        //Event Listeners
        openAction.addActionListener(this);
        exitAction.addActionListener(this);
        renderAction.addActionListener(this);
        aboutAction.addActionListener(this);

        // Configure the JFrame
        jFrame.setResizable(false);

        jFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent winEvent) {
                System.exit(0);
            }
        });

        jFrame.setSize(820,620);
        jFrame.setVisible(true);
        jFrame.pack();

    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == renderAction) {
            doHeavyLoop();
        }
    }

    public void doHeavyLoop() {
        renderer = new RendererClass(jFrame);
        for (int i=0; i<100000; i++) {
            try {
                    Thread.sleep(1);
                } catch (InterruptedException ie) {
                    System.out.println("Baaad MF.");
                }
                    renderer.updateCoordinates();
            }
        }
    }
}


/**
 * The RenedererClass class
 */
public static JFrame jFrame;
public SimpleUniverse universe;
public BrachGroup branchGroup;
public static PickCanvas pickCanvas;    

public RendererClass(JFrame frame) {

    jFrame = frame;
    jFrame.update(jFrame.getGraphics());

    theCanvas = (Canvas3D) jFrame.getContentPane().getComponent(0);
    theCanvas.addMouseListener(this);
    //STUFF HERE... CREATE AND ADD SPHERES TO THE BRANCHGROUP
    // Add the brachgroup to the Universe.
    universe.addBranchGraph(branchGroup);

    //The following three lines enable navigation through the scene using the mouse.
    OrbitBehavior ob = new OrbitBehavior(theCanvas);
    ob.setSchedulingBounds(new BoundingSphere(new Point3d(0.0,0.0,0.0), Double.MAX_VALUE));
    universe.getViewingPlatform().setViewPlatformBehavior(ob);

    //Now make it pickable for picking spheres
    pickCanvas = new PickCanvas(theCanvas, branchGroup);
    pickCanvas.setMode(PickCanvas.GEOMETRY);
    pickCanvas.setTolerance(0.0f);
}

public void updateCoordinates() {
    // Irrelevant... just set Translations transforms to the spheres
}

Entonces, la pregunta es simple ... ¿por qué la ventana JFrame se atasca y deja de responder a los eventos? Y, ¿por qué después de que el ciclo ha terminado, los eventos pasados ​​se manejan de repente? Y, por último, pero no menos importante, ¿cómo implementaría dicha funcionalidad (tener un JFrame creado en una clase y pasarlo a otra clasificación para que puedan poner cosas en un Canvas3D dentro de él ... para que mientras bucle, pueda interactuar con el Canvas3D?

Gracias por adelantado.

Respuesta 1

Soy nuevo en Java y me gustaría saber cómo asignar correctamente los valores dentro de un constructor con parámetros. El problema es cómo encapsular adecuadamente los valores, es decir, si utilizamos métodos establecidos o es ...

Entonces, dado que no he podido encontrar una manera de resolver nuestros problemas de dependencia al incluir todo desde fuentes externas, recurrí a Eclipse / IvyDE para la integración de ant / Ivy. Dicho esto, yo ...

Estoy tratando de enviar un color con cada vértice que va al sombreador, pero en un solo valor flotante. Creo que es extraño que no se puedan enviar 4 bytes como atributos con cada vértice, pero siento que es ...

Tengo un archivo docx con muchas líneas vacías para bloques de separación visual. Pero después de convertir mi docx a HTML de pdf, faltan las líneas en blanco. ¿Hay alguna posibilidad de configurar este comportamiento? YO ...