2011-08-24 3 views
3

以下は私の問題を説明する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を通過する必要があります。

答えて

2

私はちょうどMouseCursor下にあるComponentから親を取得、または確認MouseClickと

からイベントを受け取ったということComponentから親を取得し、その子から親にマウスイベントをリダイレクトすることができないこと(私が知っているように)考えます多分誰かがその:-)であなたを助けるが、ここであなたがその

親との成功のために必要なコードであることができます。

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"); 
     } 
    }); 
} 
+0

ニース!私はあなたがe.getClickCount()だけを使用するダブルクリックを検出するタイマーを使用して参照してください。私は子供から親コンテナに信号を送ることができます。しかし、私がダブルクリックすると、子リスナもキックインします。私は自分のコードベース全体を見て、より良いレイアウトのためにそれを再構成できるかどうかを確認する必要があると思います。私はそのコードとここから親にイベントを送るアイデアを得ました[link](stackoverflow.com/questions/3818246/passing-events-to-parent)。子パネル用のコードについては、OPの私の編集を参照してください。 – bili

+0

+1の 'MouseAdapter';また、_after_ 'pack()'を設定します。 – trashgod

3

ダブルクリックの解釈を選択する場合は、ユーザーの推奨間隔を使用することをお勧めします(here)。

Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"); 
+0

ありがとうございますfir link +1 – mKorbel