но я не могу заставить его сфокусироваться, поэтому события мыши идут в кадр.
Фокус актуален только для KeyEvents.
То есть только компоненты с фокусом могут получать KeyEvents.
Фокус не имеет значения для MouseEvents. Когда вы нажимаете на компонент, Swing будет искать первый компонент в родительской / дочерней иерархии, чтобы найти компонент с помощью MouseListener.
Когда я запускаю ваш код, я вижу «щелчок панели», указывающий, что MouseEvent действительно идет на панель, а не на фрейм.
this.setRequestFocusEnabled(true);
this.requestFocusInWindow();
this.requestFocus();
this.grabFocus();
Также обратите внимание, что вы можете запросить фокус только на видимом реализованном компоненте, что в основном означает, что вы запрашиваете фокус ПОСЛЕ того, как упакуете () или используете setVisible (true) для фрейма.
Правильный метод для использования - это метод requestFocusInWindow()
.
Я не верю, что setRequestFocusEnabled(true)
требуется для фокусировки на панели, только setFocusable(true)
.
Также обратите внимание, что все компоненты Swing должны быть созданы на Event Dispatch Thread (EDT)
. См. Frame Demo
пример из учебного пособия по Swing по Как создать фреймы , чтобы улучшить структуру вашего класса и убедиться, что код выполняется на EDT
.
Кроме того, pack()
должно быть сделано просто как setVisible(...)
, чтобы методы вроде setRisizable (...) работали правильно.