Code
class CellButtonsMouseListener extends MouseAdapter {
private int prevIndex = -1;
private JButton prevButton;
private static void listRepaint(JList list, Rectangle rect) {
if (Objects.nonNull(rect)) {
list.repaint(rect);
}
}
@Override public void mouseMoved(MouseEvent e) {
JList list = (JList) e.getComponent();
Point pt = e.getPoint();
int index = list.locationToIndex(pt);
if (!list.getCellBounds(index, index).contains(pt)) {
if (prevIndex >= 0) {
Rectangle r = list.getCellBounds(prevIndex, prevIndex);
listRepaint(list, r);
}
index = -1;
prevButton = null;
return;
}
if (index >= 0) {
JButton button = getButton(list, pt, index);
ButtonsRenderer renderer = (ButtonsRenderer) list.getCellRenderer();
if (Objects.nonNull(button)) {
renderer.rolloverIndex = index;
if (!button.equals(prevButton)) {
Rectangle r = list.getCellBounds(prevIndex, index);
listRepaint(list, r);
}
} else {
renderer.rolloverIndex = -1;
Rectangle r = null;
if (prevIndex == index) {
if (prevIndex >= 0 && Objects.nonNull(prevButton)) {
r = list.getCellBounds(prevIndex, prevIndex);
}
} else {
r = list.getCellBounds(index, index);
}
listRepaint(list, r);
prevIndex = -1;
}
prevButton = button;
}
prevIndex = index;
}
@Override public void mousePressed(MouseEvent e) {
JList list = (JList) e.getComponent();
Point pt = e.getPoint();
int index = list.locationToIndex(pt);
if (index >= 0) {
JButton button = getButton(list, pt, index);
if (Objects.nonNull(button)) {
listRepaint(list, list.getCellBounds(index, index));
}
}
}
@Override public void mouseReleased(MouseEvent e) {
JList list = (JList) e.getComponent();
Point pt = e.getPoint();
int index = list.locationToIndex(pt);
if (index >= 0) {
JButton button = getButton(list, pt, index);
if (Objects.nonNull(button)) {
button.doClick();
Rectangle r = list.getCellBounds(index, index);
listRepaint(list, r);
}
}
}
@Override public void mouseExited(MouseEvent e) {
JList list = (JList) e.getComponent();
ButtonsRenderer renderer = (ButtonsRenderer) list.getCellRenderer();
renderer.rolloverIndex = -1;
}
@SuppressWarnings("unchecked")
private static JButton getButton(JList list, Point pt, int index) {
Container c = (Container) list.getCellRenderer().getListCellRendererComponent(
list, "", index, false, false);
Rectangle r = list.getCellBounds(index, index);
c.setBounds(r);
// c.doLayout(); // may be needed for other layout managers (eg. FlowLayout)
pt.translate(-r.x, -r.y);
Component b = SwingUtilities.getDeepestComponentAt(c, pt.x, pt.y);
if (b instanceof JButton) {
return (JButton) b;
} else {
return null;
}
}
}
References
This comment has been removed by the author.
ReplyDelete