2011-10-08 4 views
3

BorderLayout 및 JComponents가있는 JPanel에 MouseListener/FocusListener를 추가하면 마우스 또는 포커스 이벤트를 catch 할 수 없습니다. BorderLayout가있는 JPanel의 마우스 및 포커스 이벤트를 잡을 방법이 있습니까?테두리 레이아웃이있는 JPanel의 이벤트

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Application extends JFrame{ 

    public Application(){ 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel jPanel = new JPanel(new BorderLayout()); 
     jPanel.add(new JButton("Button")); 

     jPanel.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseExited(MouseEvent e) { 
       System.out.println("mouseExited"); 
      } 
     }); 

//  if border is set then listener works if not does not 
//  jPanel.setBorder(new LineBorder(Color.black, 1)); 
     setLayout(new FlowLayout()); 
     add(jPanel); 
     setSize(400, 400); 
     setVisible(true); 
    } 

    public static void main(String[]args){ 
     new Application().setVisible(true); 
    } 

} 
+2

이 없습니다 – mKorbel

+0

와 함께 할 수 있지만 JPanel을 인스턴스화하고 두 jbuttons (중앙 및 그것의 상단) jpanel의 마우스 및 포커스 이벤트가 작동하지 않는 경우 – MOD

+0

구성 요소에 속하는 영역이 해당 요소에 속하지 않기 때문에 것 같아요. 컨테이너. 모든 지역이 그 구성 요소에 속하기 때문에 국경 배치 된 컨테이너가 화재 마우스 및 초점 이벤트를 막을 수있는 이유는 여기에 있습니다. – MOD

답변

3

마찬가지로 간단히 말해서 실수입니다. JFrameFlowLayout이 지정되어 있으므로 에만 필요한 영역을 차지합니다. JPanelBorder을 추가하여 테스트 할 수 있습니다. 지금은 작동

,

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Application extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public Application() { 
     JPanel jPanel = new JPanel(); 
     jPanel.setLayout(new FlowLayout()); 
     jPanel.add(new JButton("Button")); 
     jPanel.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseExited(MouseEvent e) { 
       System.out.println("mouseExited"); 
      } 
     }); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 
     add(jPanel); 
     setSize(400, 400); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Application().setVisible(true); 
      } 
     }); 
    } 
} 
1) 당신이 http://sscce.org/ 형태로 문제 (들)을 보여주는 코드를 게시하시기 바랍니다 수 있습니다, 2) LayoutManager의 (귀하의 경우에는 BorderLayout)에서 아무
0

다음 코드는 해당 이벤트를 StdOut에 인쇄합니다.

JFrame frame = new JFrame(); 

    JPanel panel = new JPanel(new BorderLayout()); 
    JPanel innerPanel = new JPanel(); 
    innerPanel.setSize(200,200); 
    panel.add(innerPanel); 
    panel.addMouseListener(new MouseListener() { 
     public void mouseReleased(MouseEvent e) { 
      System.out.println("MouseReleased"); 
     } 
     public void mousePressed(MouseEvent e) { 
      System.out.println("MousePressed"); 
     } 
     public void mouseExited(MouseEvent e) { 
      System.out.println("MouseExited"); 
     } 
     public void mouseEntered(MouseEvent e) { 
      System.out.println("MouseEntered"); 
     } 
     public void mouseClicked(MouseEvent e) { 
      System.out.println("MouseClicked"); 
     } 
    }); 

    frame.setContentPane(panel); 
    frame.setVisible(true);` 
+0

내부 구성 요소가 패널이었습니다. – MOD