2011-10-08 18 views
3

當我將MouseListener/FocusListener添加到其中具有BorderLayout和JComponents的JPanel時,我無法捕獲鼠標或焦點事件。有沒有什麼方法可以捕獲一個JPanel的鼠標和焦點事件有BorderLayout?具有邊框佈局的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

1)你可以請張貼在http://sscce.org/形式展示您的問題(一個或多個)代碼,2)佈局管理(你的情況的BorderLayout)無關與MouseEvents – mKorbel

+0

做但是,當我實例化一個JPanel並把它兩個jbuttons(中心和頂部)jpanel的鼠標和焦點事件不起作用 – MOD

+0

我想這是因爲屬於組件的區域不屬於它容器。這就是爲什麼邊框佈局的容器不能放火鼠標和焦點事件因爲所有區域都屬於它的組件 – MOD

回答

3

如上所述,只是一個簡單的錯誤。因爲JFrame給出了FlowLayout,所以JPanel僅佔用JButton所需的面積。您可以通過將Border添加到JPanel來測試。

現在它的工作原理,

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); 
      } 
     }); 
    } 
} 
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