Перенаправление событий мыши Swing - PullRequest
2 голосов
/ 09 июня 2011

Я пытаюсь сделать возможным отображение и взаимодействие с компонентами Java Swing поверх холста Java3D. Я отображаю компоненты, рисуя прозрачную JPanel в буферизованное изображение, а затем рисую этот буфер поверх холста, используя J3DGraphics2D.

Что я не могу понять, так это как перенаправить события мыши на компоненты свинга в JPanel. Я хочу, чтобы все события клавиатуры и мыши на Canvas3D отправлялись в JPanel, а затем возвращались к Canvas3D, если они не захвачены какими-либо компонентами свинга (например, мышь не находится над ними). ​​

Я пытался вызвать Container.dispatchEvent (AWTEvent), но он не может успешно отправить события соответствующим компонентам, даже когда, например, курсор мыши находится прямо над кнопкой в ​​контейнере.

Кто-нибудь знает способ сделать это? Это должно быть возможно.

1 Ответ

0 голосов
/ 11 июня 2011

Наконец-то я понял! Это уже сделано - используйте JCanvas3D и JLayeredPane. Это противоположный подход к визуализации компонентов Swing в postRender () - JCanvas3D выполняет рендеринг в внеэкранный буфер, а затем рисует на экране с помощью AWT, создавая легкий холст, который правильно взаимодействует с компонентами в JLayeredPane, даже если они прозрачны .

Одна вещь, на которую следует обратить внимание - JCanvas3D перенаправляет весь ввод на внеэкранный Canvas3D, но сначала мой Orbiter не работал, как это было с тяжелым Canvas3D. Все, что вам нужно сделать, это добавить слушателей мыши и ключа в JCanvas3D, потому что AWT даже не доставит эти события, если для них не зарегистрированы слушатели.

...