Обновление: Тот же метод, что и раньше, но с более подробным пошаговым объяснением.
Другие респонденты задаются вопросом, чего вы хотите достичь с этим, и задаются вопросом о дизайне приложения, которое неожиданно появляется у пользователя. Я предполагаю, что вопрос заключается в том, насколько вы настроены реализовать эту функциональность именно так, как вы описали. Сама техника может быть полезна и для других целей, что является моей главной мотивацией для моего нового, улучшенного пересмотра этого ответа.
Насколько я знаю, кадр, который не виден, не может захватывать события мыши. Поэтому он не будет знать, находится ли мышь внутри него или нет.
В этой проблеме есть лазейка: если вы сделаете рамку видимой, но без рамки и полностью прозрачной, она будет видимой в техническом смысле, но невидимой для пользователя для практических целей.
Часть без полей проста: setUndecorated(true)
.
Было бы замечательно, если бы у JFrame
был такой метод, как setOpaque()
или setTranslucent()
, где вы могли бы сделать его полностью прозрачным, но, увы, его нет.
В другом ответе упоминается решение на основе частного класса Sun, которое позволяет вам сделать окно прозрачным. Это будет работать для текущих и, возможно, ближайших будущих JRE Sun, но далеко не гарантированно будет работать с другими и будущими JRE, поэтому я не могу рекомендовать это. Sun явно советует против использовать свои частные уроки таким образом.
Существует альтернативная, несколько хакерская альтернатива: рамка остается полностью видимой, но за ней отображается изображение скриншота экрана. Поскольку это означает, что мы эффективно просматриваем кадр, он фактически невидим. Это решение описано здесь: http://onjava.com/pub/a/onjava/excerpt/swinghks_hack41/index.html?CMP=OTC-FP2116136014. Автор и я оба признаем, что это немного неуклюже; это также включает в себя гораздо больше кода, чем необходимо. Но он основан на стандартном кодировании Java и должен поддерживаться неизменным во многих средах Java выше версии 1.4 или около того.
Совет описывает, как создать Component
, который отображает фон экрана. Это хорошо, когда вы хотите, чтобы рамка была невидимой, но что происходит, когда вы хотите, чтобы она была нормально видимой?
Нужно дать JFrame
ContentPane
a CardLayout
и добавить к нему компонент TransparentBackground
и предполагаемый основной видимый компонент (вероятно, JPanel
). С этой настройкой переключение между «невидимым» и видимым включает просто:
setUndecorated(false)
// (true)
cardLayout.last()
// (первый)
Это переключение, конечно же, будет управляться MouseListener
, которое вы можете добавить в JFrame.