2014-10-26 3 views
0

Я ищу, чтобы создать пользовательский указатель мыши для приложения рисования в Java. Приложение должно работать в Windows, и из-за ограничений в окнах относительно размера курсора (32 * 32 px) невозможно использовать встроенные функции Cursor.Пользовательский рисунок курсора мыши в Java (swing)

Я попытался нарисовать изображение в текущем местоположении мыши с помощью MouseMotionListener, и это работает, когда я рисую его на пустой панели. Изображение правильно «следует» мыши, так что это не проблема.

@Override 
public void paintComponent(Graphics g) {   
    super.paintComponent(g); 
    g.drawImage(cursorimage, x, y, null); 
} 

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

Я попробовал несколько вещей, как изменение порядка в paintComponent:

@Override 
public void paintComponent(Graphics g) {   
    g.drawImage(cursorimage, x, y, null); 
    super.paintComponent(g); 
} 

Я также попытался перекрывая другие методы краски, как paintChildren, paintComponents или даже сам метод краски, но это не кажется, работайте. У одного из участников панели также есть метод drawComponent, и я подозреваю, что это также имеет влияние.

+0

Возможно, я ошибаюсь, но недавно я поговорил с другим программистом, который указал на проблемы с Z-упорядочением при объединении AWT и Swing. Я не знаю о коде, который стоит за этой программой, но, возможно, это может иметь какое-то отношение к этому? – DreadHeadedDeveloper

+0

Я не заглядывал в это. Я обязательно узнаю, может ли это вызвать мою проблему. Благодаря! – Hayeb

ответ

0

Вы должны нарисовать в стекле. См. Учебник по Java на http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html с исходным кодом на http://docs.oracle.com/javase/tutorial/uiswing/examples/components/GlassPaneDemoProject/src/components/GlassPaneDemo.java Если вы измените этот исходный код, чтобы метод mouseMoved вызывал redispatchMouseEvent (e, true); красная точка будет действовать как курсор.

К сожалению, я обнаружил, что это не работает на компьютерах Mac, работающих под управлением Java 1.6, но работает на компьютерах под управлением Java 1.8 и Windows.

Смежные вопросы