Я фактически не знал о классе JLayer
, пока не прочитал твой вопрос.У меня нет полного ответа, но я думаю, что этого достаточно, чтобы подтолкнуть вас в правильном направлении.Мне помог урок из урока Oracle по Java: Как декорировать компоненты с помощью класса JLayer .На этом уроке есть раздел под названием Ответ на событие , который помог мне выяснить, как частично решить вашу проблему.По сути, вы просто рисуете метки, а не добавляете их как компоненты, и поэтому они не будут реагировать на события мыши.Поскольку метки можно считать частью JLayer
компонента, который добавляется как компонент, вы можете настроить JLayer
для реагирования на события мыши.Как указано в уроке, вам необходимо переопределить некоторые другие методы в вашем классе TopRightCornerLabelLayerUI
.Код ниже содержит два из этих методов.Добавьте их в свой код и посмотрите, дают ли они ожидаемый результат.
public void installUI(JComponent c) {
super.installUI(c);
((JLayer<?>) c).setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK);
}
protected void processMouseEvent(MouseEvent e, JLayer l) {
if (e.getID() == MouseEvent.MOUSE_CLICKED) {
Point pt = e.getPoint();
if (pt.x >= xTemplateHyperlink && pt.x <= (xTemplateHyperlink + widthTemplateHyperlink)) {
System.out.println("clicked");
}
}
}
РЕДАКТИРОВАТЬ: Забыл упомянуть, что я добавил следующих членов в ваш TopRightCornerLabelLayerUI
класс ...
private int xTemplateHyperlink;
private int yTemplateHyperlink;
private int widthTemplateHyperlink;
private int heightTemplateHyperlink;
И установить их значения в методе paint()
примерно так ...
Dimension templateDimension = templateHyperlink.getPreferredSize();
xTemplateHyperlink = c.getWidth() - templateDimension.width - 5;
yTemplateHyperlink = 2;
widthTemplateHyperlink = templateDimension.width;
heightTemplateHyperlink = templateDimension.height;
, что объясняет код в методе processMouseEvent()
.