Когда таблица захватывает событие мыши для выбора ячейки, она передает событие мыши в самый глубокий компонент независимо от того, может ли этот компонент обрабатывать события мыши.В вашем примере первый щелчок заканчивается на одном из JLabels
, полностью минуя JToggleButton
.Как только JToggleButton
стал активным редактором ячеек, щелчки мышью работают на нем нормально.Если бы он потерял фокус, для активации снова потребовалось бы два щелчка.
Вы также можете увидеть это, если заметите, что в своей демонстрации вы нажимаете на рамке кнопки, а не на панели,Кнопка работает так, как нужно.
Один из способов обойти это - убедиться, что любое событие мыши направлено на любой компонент в пределах JToggleButton
.Вы можете сделать это, используя этот статический метод:
static void addEventBubble(final Container target, Container container) {
for(Component comp:container.getComponents()) {
if (comp instanceof Container) {
addEventBubble(target, (Container) comp);
}
comp.addMouseListener(new MouseAdapter() {
private MouseEvent retarget(MouseEvent e) {
return new MouseEvent(target, e.getID(), e.getWhen(),
e.getModifiers(), e.getX(), e.getY(),
e.getClickCount(), e.isPopupTrigger(),
e.getButton());
}
public void mousePressed(MouseEvent e) {
MouseEvent r = retarget(e);
for(MouseListener listen:target.getMouseListeners()) {
listen.mousePressed(r);
}
}
public void mouseReleased(MouseEvent e) {
MouseEvent r = retarget(e);
for(MouseListener listen:target.getMouseListeners()) {
listen.mouseReleased(r);
}
}
public void mouseClicked(MouseEvent e) {
MouseEvent r = retarget(e);
for(MouseListener listen:target.getMouseListeners()) {
listen.mouseClicked(r);
}
}
});
}
}
и затем в конце вашего конструктора вызовите:
addEventBubble(this,this);
После этого любое событие мыши для любого компонента внутри кнопки также будетдойти до кнопки и, следовательно, изменить ее состояние.После этого я обнаружил, что кнопка реагирует на каждый щелчок по желанию.