将事件传递给父级
2022-09-04 01:27:34
我想创建一个应用,其中某些事件应该像传递到父容器一样进行处理。例如,我有一个包含.顶部现在实现鼠标按下和拖动。我需要做什么,以使事件看起来像是它们到达的,而不是标签本身。(更改源对象很重要)JPanel
JLabel
JPanel
JPanel
有没有比实际实现事件并在父级中复制它们更好的解决方案?(在一些有>5个孩子的物体之后,这会变得乏味)。
我想创建一个应用,其中某些事件应该像传递到父容器一样进行处理。例如,我有一个包含.顶部现在实现鼠标按下和拖动。我需要做什么,以使事件看起来像是它们到达的,而不是标签本身。(更改源对象很重要)JPanel
JLabel
JPanel
JPanel
有没有比实际实现事件并在父级中复制它们更好的解决方案?(在一些有>5个孩子的物体之后,这会变得乏味)。
在事件侦听器上,可以将事件调度到父组件。
作为事件处理函数参数:myEvent
Component source=(Component)myEvent.getSource();
source.getParent().dispatchEvent(myEvent);
但此解决方案意味着为要添加的每个元素创建一个新的 EventListener。
因此,您可以创建单个事件处理程序并重用它,将其添加到所有选定的子级,如下所示:
final Container parent=this; //we are a the parent container creation code
MouseListener myCommonListener=new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
parent.dispatchEvent(e);
}
@Override
public void mouseEntered(MouseEvent e) {
parent.dispatchEvent(e);
}
@Override
public void mouseExited(MouseEvent e) {
parent.dispatchEvent(e);
}
@Override
public void mousePressed(MouseEvent e) {
parent.dispatchEvent(e);
}
@Override
public void mouseReleased(MouseEvent e) {
parent.dispatchEvent(e);
}
};
JLabel label=new JLabel("This is the first Label");
label.addMouseListener(myCommonListener);
JLabel label2=new JLabel("This is the second Label");
label2.addMouseListener(myCommonListener);
//... and so on
您应该在将事件分派给父级之前转换事件。转换包括坐标转换为父相对坐标。
public class RedispatchingMouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener{
public void mouseClicked(MouseEvent e) {
redispatchToParent(e);
}
public void mousePressed(MouseEvent e) {
redispatchToParent(e);
}
public void mouseReleased(MouseEvent e) {
redispatchToParent(e);
}
public void mouseEntered(MouseEvent e) {
redispatchToParent(e);
}
public void mouseExited(MouseEvent e) {
redispatchToParent(e);
}
public void mouseWheelMoved(MouseWheelEvent e){
redispatchToParent(e);
}
public void mouseDragged(MouseEvent e){
redispatchToParent(e);
}
public void mouseMoved(MouseEvent e) {
redispatchToParent(e);
}
private void redispatchToParent(MouseEvent e){
Component source = (Component) e.getSource();
MouseEvent parentEvent = SwingUtilities.convertMouseEvent(source, e, source.getParent());
source.getParent().dispatchEvent(parentEvent);
}
}