Темы: Что же их смущает? Два Runnables с мышью слушателя - PullRequest
0 голосов
/ 22 марта 2010

У меня есть 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 RECORDER RECIRE RECORER GUI RECORDER и т. Д. И т. Д.

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

Ответы [ 2 ]

1 голос
/ 22 марта 2010

Когда 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

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

1 голос
/ 22 марта 2010

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

...