Я думаю (насколько я знаю), что невозможно перенаправить событие Mouse от дочернего к его родительскому элементу, просто получить родительский элемент от Component, который находится под MouseCursor, или получить родительский элемент от Component, который получил Events от MouseClick
Конечно, может быть, кто-то может помочь вам с этим :-), но вот код, который вам нужен для успеха с этим
родителем:
import java.awt.*;
import javax.swing.*;
public class PPanel extends JPanel {
private static final long serialVersionUID = 1L;
private APanel panel1;
private APanel panel2;
private APanel panel3;
public PPanel() {
setLayout(new GridLayout(0, 1));
panel1 = new APanel();
panel2 = new APanel();
panel2.setBackground(Color.yellow);
panel3 = new APanel();
panel3.setBackground(Color.green);
add(panel1);
add(panel2);
add(panel3);
setBackground(Color.blue);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
PPanel panel = new PPanel();
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(350, 300));
frame.setTitle("Demo");
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
}
});
}
}
Ребенок:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JPanel;
import javax.swing.Timer;
public class APanel extends JPanel {
private static final long serialVersionUID = 1L;
private Point pt;
public APanel() {
timer.setRepeats(false);
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (timer.isRunning() && !e.isConsumed() && e.getClickCount() > 1) {
System.out.println("double from child");
pt = null;
timer.stop();
} else {
pt = e.getPoint();
timer.restart();
}
}
});
setBackground(Color.red);
setVisible(true);
}
private Timer timer = new Timer(400, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("single from child");
}
});
}