普通组件如何检测鼠标事件

How do normal components detect Mouse Events

比如JLists如何得到MouseEvents?我应该如何创建自己的 ComponentMouseListener

官方 JLists、JButtons、JCheckBoxes 和其他 swing 组件没有使用 MouseListeners 是吗?他们使用什么,如果我正在制作一个,我应该使用什么? (可能有 accessibility 支持)

您的组件必须扩展 JComponent 并实现 MouseListener

这些是您必须覆盖的方法:

@Override
public void mouseClicked(MouseEvent e) {
    throw new UnsupportedOperationException();
}

@Override
public void mousePressed(MouseEvent e) {
    throw new UnsupportedOperationException();
}

@Override
public void mouseReleased(MouseEvent e) {
    throw new UnsupportedOperationException();
}

@Override
public void mouseEntered(MouseEvent e) {
    throw new UnsupportedOperationException();
}

@Override
public void mouseExited(MouseEvent e) {
    throw new UnsupportedOperationException();
}

从可访问性的角度来看,您必须实现的方法取决于向可访问性公开的元素的角色 API。对于按钮,您必须实施 mouseClicked 处理程序,因为这是可访问性 API 将尝试调度的内容。

官方组件使用普通监听器(MouseListerner、ComponentListener、FocusListener 等),但您不会立即看到它,因为它们都封装在 Look&Feel UI 类 中。例如。对于 JList,请查看 BasicListUI,您会找到合适的侦听器。

对于您的自定义组件,通常直接实现监听器就足够了。但是,如果您还想支持可插入的观感,您可能需要花费更多的时间并为每个观感分别提供 UI 实现,就像标准的 jre-components 所做的那样。