Pregunta

Tengo una jwindow y un jframe que he hecho Runnable y ambos implementan un oyente del mouse. Tengo muchas pruebas que hacer para un proyecto mío y para simplificarlo, deseo poder automatizar la mayor parte, por lo que he comenzado mi propia grabadora y repetidor de mouse (utiliza la clase de robot Java).

¡Como una cosa simplificada de autohotkey o autoit ... pero se ejecutará en mi máquina Ubuntu también como mi Windows!

La jwindow que he hecho es translúcida y cubre toda la pantalla, cuando hace clic en ella, desaparece y reproduce el clic en el objeto detrás y luego reaparece. Este es el proceso de grabación. Cuando el usuario hace clic derecho, se establece en no visible y se reproducen las acciones grabadas.

Durante la repetición, quiero la opción de poder salir de toda la aplicación, por lo que, por eso, la mejor manera de hacerlo sería hacer que JFRame y el JWindow sean ejecutables.

El Jframe es simplemente para ofrecer una opción de cierre desde la aplicación.

Entonces, en mi clase principal tengo

public static void Main(String[] args){
    recorder = new Recorder();
    gui = new GUI();
    Thread tr = new Thread(recorder);
    Thread tg = new Thread(gui);
    tr.setName("Recorder");
    tg.setName("GUI");
    tr.start();
    tg.start();
}

Mi comprensión es que la grabadora y la GUI son objetos ejecutables y se convierten en hilos a través del comando nuevo de hilos. Cuando uso .start () estoy comenzando la ejecución del hilo y desde aquí en el sistema decide qué hilo se está ejecutando en un momento particular.

En las clases de grabadora y GUI.

public class Recorder
        implements Runnable, MouseListener {

//Constructor and other code

    public void mouseClicked(MouseEvent e) {

        if (e.getButton() == MouseEvent.BUTTON1) {
             //Record events
        }else{
             //Replay events
        }
        System.exit(0);
    }

    public void run() {
        System.out.println("Recorder");
    }
}

public class GUI 
    implements Runnable, MouseListener {

//Constructor, simply constructs JFrame and sets mouselistener to it

   public void mouseClicked(MouseEvent e) {
       System.exit(0);
   }

   public void run() {
        System.out.println("GUI");
   }

}

Mi aplicación imprime la grabadora y luego la GUI me permite grabar mis eventos y luego hacer clic derecho en JWindow para reproducirlos ...

Pero luego, cuando haga clic en el botón Cerrar del Jframe o incluso en el marco debido al oyente del mouse, ¿no saldrá hasta que todas las acciones se hayan reproducido por completo?

Una cosa que me pregunté es lo que hice en ejecución es lo que es lo que mantiene el hilo en funcionamiento. Entonces, cuando System.out.println (""); ¿Se ejecuta los troqueles de hilo? Así que probé un bucle de ruidos y mi aplicación imprime con éxito

Registradora de registrador de GUI GUI Registrador de registrador GUI, etc.

Así que puedo ver que los hilos se están ejecutando simultáneamente ... es solo que todas las otras acciones fuera de la ejecución no parecen ejecutarse ... ¿Cómo puedo incluir a mi oyente del mouse, etc. dentro de la ejecución de los hilos?

¿Fue útil?

Solución

Usted está confundiendo Threads con Objects. Cuando tienes un Object eso es un Runnable Eso solo da un punto de partida para un hilo. Sin embargo, esto no significa que cuando otro hilo (en este caso el hilo del evento que maneja el MouseListener) llama a un método en tu Runnable que ejecutó por el hilo que está ejecutando el Runnable. Cuando se llama un método, nunca cambia a otro hilo. Si quieres esto, necesitas un mecanismo. Por ejemplo una cola que el MouseListener puede publicar tareas a y en su Runnable.run() Luego sigues buscando una nueva tarea.

Otros consejos

Cuando Swing inicializa, se inicia su propio hilo de despacho de eventos. Todos los métodos de su oyente se ejecutan dentro de este hilo. No importa si su objeto de oyente implementa o no.

Vea este tutorial para comprender los conceptos básicos de múltiples subprocesos en el contexto del swing. http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html

La respuesta real a su pregunta está en esta parte del tutorial:

http://java.sun.com/docs/books/tutorial/uiswing/concurrency/cancel.html

Pero le sugiero que pase por todo el tutorial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top