强者当心
大多数 JSomething 并不打算用作容器,即使它是可能的——无论如何,这样做的结果或多或少在视觉和行为上是不确定的!
也就是说,最近做了它,以实现类似于 Windows 任务对话框的东西。如果要求包括保持按钮可点击(以及为什么你会误用它作为容器:-) 主要问题(布局分开)是使所有添加的组件完全鼠标透明。这比预期的要困难得多。最低要求是不允许添加 mouseListener 并禁用接受 mouseEvents:
final JTextArea area = new JTextArea("replacement ..") {
@Override
public synchronized void addMouseListener(MouseListener l) {
LOG.info("adding here ...?");
}
@Override
public synchronized void addMouseMotionListener(
MouseMotionListener l) {
}
@Override
public synchronized void addMouseWheelListener(
MouseWheelListener l) {
}
@Override
public void addNotify() {
disableEvents(AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.MOUSE_MOTION_EVENT_MASK |
AWTEvent.MOUSE_WHEEL_EVENT_MASK);
super.addNotify();
}
};
另外确保它不可聚焦
area.setEditable(false);
area.setFocusable(false);
area.setRequestFocusEnabled(false);
加上取消注册拖动和工具提示
ToolTipManager.sharedInstance().unregisterComponent(area);
area.setDragEnabled(false);
尽管如此,前面可能仍然会有惊喜,fi 调用以下两次(即再次禁用和启用),这将在内部重新启用 mouseEvent:
area.setAutoscrolls(!area.getAutoscrolls());
所以说到底,我们可能会侥幸逃脱——但永远不能完全确定我们成功了。