Темы: Что же их смущает? Два Runnables с мышью слушателя

У меня есть JWindow и JFrame, которые я сделал работоспособными, и оба реализуют слушатель мыши. У меня есть много испытаний для моего проекта, и чтобы упростить его, я хочу иметь возможность автоматизировать большинство из них, поэтому я запустил свой собственный рекордер и проигрыватель мыши (использует Java Robot Class).

Вроде как упрощенный AutoHotKey или AutoIt... но он будет работать на моей машине с Ubuntu так же, как и на моей Windows!!!

JWindow, которое я сделал, является полупрозрачным и охватывает весь экран, когда вы нажимаете на него, оно исчезает и воспроизводит щелчок на объект позади, а затем снова появляется. Это процесс записи. Когда пользователь нажимает правую кнопку, он становится невидимым, а записанные действия воспроизводятся.

Во время воспроизведения я хочу, чтобы опция могла выходить из всего приложения, и поэтому я считаю, что лучший способ сделать это - сделать JFrame и JWindow Runnable.

JFrame просто предложить закрытый вариант из приложения.

Итак, в моем основном классе у меня есть

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

Насколько я понимаю, Recorder и GUI являются выполняемыми объектами, и они превращаются в потоки с помощью новой команды Thread. Когда я использую.start(), я начинаю выполнение потока, и с этого момента система решает, какой поток запущен в любое конкретное время.

На классы Recorder и 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");
   }

}

Мое приложение распечатывает Recorder, а затем графический интерфейс. Позволяет мне записывать мои события, затем щелкнуть правой кнопкой мыши на JWindow, чтобы воспроизвести их...

но затем, когда я нажимаю кнопку закрытия JFrame или даже в кадре из-за слушателя мыши, он не завершается, пока все действия не будут полностью воспроизведены?

Одна вещь, которую я удивляюсь, это то, что когда я запускаю, что поддерживает поток? Поэтому когда System.out.println(""); выполняется поток умирает? Поэтому я попытался их обойти, и мое приложение успешно напечатало

GUI GUI RECORDER RECIRE GUI RECORDER и т. Д. И т. Д.

Таким образом, я вижу, что эти потоки работают одновременно... просто все остальные действия вне цикла, похоже, не выполняются... Как я могу включить прослушиватель мыши и т. Д. В выполнение потоков?

2 ответа

Решение

Вы путаете Threads с Objects, Когда у вас есть Object это Runnable это просто дает отправную точку для потока. Однако это не означает, что когда другой поток (в этом случае поток событий, который обрабатывает MouseListener) вызывает метод в вашем Runnable что он выполняется потоком, который выполняет Runnable, Когда метод вызывается, он никогда не переключается на другой поток. Если вы хотите этого, вам нужен механизм. Например, очередь, которая MouseListener можете публиковать задания, и в вашем Runnable.run() Затем вы продолжаете искать новое задание.

Когда Swing инициализируется, он запускает собственный поток Event Dispatch. Все ваши методы слушателя выполняются в этом потоке. Не имеет значения, реализует ли ваш объект слушателя работоспособность.

Посмотрите это руководство, чтобы понять основы многопоточности в контексте Swing. http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html

Фактический ответ на ваш вопрос находится в этой части урока:

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

Но я предлагаю вам пройти весь урок.

Другие вопросы по тегам