以下は私の問題を説明するSSCCEです。背面のJPanel親を選択
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;
public class APanel extends JPanel{
public APanel() {
this.setVisible(true);
this.setBackground(Color.red);
this.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
if(e.getClickCount()==2)
{
}
System.out.println("Child panel clicked!");
}
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) {}
});
}
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PPanel extends JPanel{
private APanel panel1;
private APanel panel2;
private APanel panel3;
public PPanel() {
this.setLayout(new GridLayout(0,1));
panel1 = new APanel();
panel2 = new APanel();
panel2.setBackground(Color.yellow);
panel3 = new APanel();
panel3.setBackground(Color.green);
this.add(panel1);
this.add(panel2);
this.add(panel3);
this.setBackground(Color.blue);
this.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
System.out.println("Parent panel clicked!");
}
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) {}
});
}
public static void main(String[] args) {
JFrame frame = new JFrame();
PPanel panel = new PPanel();
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(350, 300));
frame.setTitle("Demo");
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
私は次の操作を行うことができます方法:
e.getClickCount()== 1、親のMouseListenerは "親パネルをクリック!" アクティブになり、それが印刷される場合は- 。
e.getClickCount()== 2の場合、子のMouseListnerがアクティブになり、「子パネルクリック!」が出力されます。
Edit1:提案された解決策に近づきます。場合
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(); Component component = (Component)e.getSource(); component.getParent().dispatchEvent(e); timer.restart(); } } }); setBackground(Color.red); setVisible(true); } private Timer timer = new Timer(200, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //System.out.println("single from child"); } });
}
、MouseEventのこのlinkに関心があるかもしれない、容器のmultiplevelを通過する必要があります。
ニース!私はあなたがe.getClickCount()だけを使用するダブルクリックを検出するタイマーを使用して参照してください。私は子供から親コンテナに信号を送ることができます。しかし、私がダブルクリックすると、子リスナもキックインします。私は自分のコードベース全体を見て、より良いレイアウトのためにそれを再構成できるかどうかを確認する必要があると思います。私はそのコードとここから親にイベントを送るアイデアを得ました[link](stackoverflow.com/questions/3818246/passing-events-to-parent)。子パネル用のコードについては、OPの私の編集を参照してください。 – bili
+1の 'MouseAdapter';また、_after_ 'pack()'を設定します。 – trashgod