Oyentes y validación / repintado

Entonces tengo este problema. Tengo un programa que crea y carga archivos.

Cuando cargo un archivo en mi programa, confío en un escucha de componentes que me dice cuándo el componente específico está "lleno", y luego mueve todos los componentes de acuerdo con eso.

Agrego cada componente en la parte superior, y luego el oyente se registra cuando el componente padre se "llena" y mueve el componente inferior a un nuevo padre que también crea. Piense en ello como la adición de una nueva línea de texto al comienzo de un documento MSWord de cien páginas.

Ese oyente también se basa en la configuración de la GUI: si todo lo que está en la memoria no se pinta en la pantalla, toma alturas de componentes incorrectas (generalmente son 0) y las usa en sus cálculos que luego salen mal, y todo se confunde.

Aquí hay un diagrama de flujo de esa parte de mi programa:

(todo sucede en un JPanel en un JFrame)

trigger opening method:
{
    repeat this x (lets say e.g. 100) times:
    {
        trigger addComponent method
        {
            add component
            {
                adding component triggers the component listner 8if there is no more room in parent)
                {
                    move all of the components one place down, move the ones out of bounds to next "page"
                    repaint and revalidate whole JFrame (inside listener)
                }
            }
            repaint and revalidate whole JFrame (part of addComponent method)
        }
        repaint and revalidate whole JFrame(part of opening methid, after component addition)       
    }
    repaint and revalidate whole JFrame (as a part of opening method, final repaint/validate)
}

La razón de esto puede repintar / validar es que el método addComponent, así como el oyente tiene otras funciones y se le llama en otros lugares donde ese es el único lugar (óptimo) para repintar / validar.

El problema es que JFrame no se vuelve a pintar hasta la última llamada (final) de validación / repintado en el método de apertura. Intenté agregar Thread.sleep (1000) a varios lugares en el código (después de validar / repintar) para probar esto.

Además, que yo sepa, cuando se activa un oyente componente, se detiene en la línea que lo activó, luego se ejecuta y luego continúa desde esa línea, ¿verdad?

¿Cómo puedo solucionar esto? ¿Cómo fuerzo a mi programa a volver a pintar / validar después de que se agregue cada componente nuevo y luego nuevamente después de que el oyente hizo su trabajo?

Responder a los dos primeros comentarios : Primero, Thread.sleep (1000) fue solo para diagnosticar el problema. Justo antes de que el método Thread.sleep (1000) fuera el método de volver a pintar / validar, pensé que si detenía el programa justo después de llamar a reapint (), después de cada pausa, la GUI se volvería a pintar y vería un nuevo elemento agregado, que no era el caso.

En segundo lugar, con respecto a los cálculos largos, esos cálculos no son tan largos (ejecutar esto con 20 componentes obtiene resultados momentáneos, aunque no los que se desean). Además, esos cálculos requieren eliminar y agregar componentes a la GUI con bastante frecuencia (cada 10-20 líneas), por lo que incorporar SwingWorker en eso es casi imposible y no es necesario.

En tercer lugar, creo que te perdiste todo el punto. La duración de la ejecución no es el problema real aquí, ni el congelamiento de la GUI (que en realidad no ocurre, de todos modos no lo suficiente como para ser notable). El problema es que se volvió a pintar / validar en el bucle un total de 3-4 veces para cada componente (aproximadamente 60-80 veces si abro un archivo con 20 componentes), y la única vez que vi que se ejecutaba es cuando la última vez que se llamó, después del bucle ...

Incluso puse el método System.out.println ("algo") justo antes y justo después de volver a pintar / validar. Imprimió "algo" dos veces, pero nunca volvió a pintar / validar.

Respuesta 1

Quiero crear un dispositivo en IoT Hub cuando agrego un dispositivo en mi aplicación. Estoy buscando puntos finales REST disponibles para realizar operaciones. O cualquier SDK disponible para hacer esto.

Estoy configurando MS Exchange Server 2007 por primera vez. Aunque lo he configurado con éxito. Solo quiero saber sobre la propiedad mail.smtp.auth.ntlm.domain. Uno de mis clientes ha preguntado ...

Tengo un cuadro de texto para tomar Cantidad, es decir, $ 100. Mis cuadros de texto ya tienen un signo $ en ellos: <g: TextBox ui: field = "fee"> $ </ g: TextBox> Lo que quiero es que un usuario nunca pueda eliminar / editar $ ...

¿Cómo puedo verificar la colisión en un juego basado en fichas? He mirado los ejemplos que tiene el SDK de Android, pero no puedo entenderlos porque soy nuevo en la programación de Android. Esta es mi clase de mapa y mosaico ...