2011-10-08 1 views
3

Lorsque j'ajoute un MouseListener/FocusListener à un JPanel qui a un BorderLayout et JComponents, je ne peux pas attraper les événements mouse ou focus. Yat-il un moyen d'attraper la souris d'un JPanel et les événements de mise au point qui a un BorderLayout?Événements sur un JPanel qui a une disposition de bordure

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) pouvez-vous s'il vous plaît poster le code qui démontrent votre question (s) sous forme de http://sscce.org/, 2) LayoutManager (dans votre cas BorderLayout) n'a rien à faire avec MouseEvents – mKorbel

+0

Mais quand j'instancie un JPanel et y met deux jbuttons (au centre et en haut) la souris et l'évènement focus de jpanel ne fonctionnent pas – MOD

+0

Je suppose que c'est parce que la zone qui appartient au composant n'appartient pas à son récipient. C'est pourquoi le conteneur de mise en page frontière ne peut pas déclencher la souris et l'événement focus parce que toute la zone appartient à ses composants – MOD

Répondre

3

Comme dit, juste une erreur simple. Parce que JFrame est donné un FlowLayout, le JPanel occupe la zone requise pour JButton seulement. Vous pouvez tester cela en ajoutant un Border au JPanel.

Maintenant, cela fonctionne,

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

Le code suivant imprime les événements correspondants à 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

qui fonctionne mais le composant interne n'était pas un panneau c'était bouton. – MOD

Questions connexes