Темы: Что же их смущает? Два 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
Но я предлагаю вам пройти весь урок.