RT
我在JFrame放了几个JPanel, JPanel里又有其他东西, 然后事件监听加在JFrame上
当鼠标点击事件发生时 好象JFrame并没有产生相应的事件 
我想了下鼠标是点在了JFrame里的其他组件上而不是JFrame上, 因此没有相应事件产生 对不对???
有什么办法让鼠标事件不管发生在哪个位置 都能让事件得到监听?
不要告诉我给每个组件都加上监听,太麻烦 也不够简洁, 我要的是加在顶层容器上 能监听容器里任何组件上发生的鼠标事件的方法
不知道我的表述够不够清楚.....
谢谢

解决方案 »

  1.   

    我的怎么可以的?
    package com.gui;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.JFrame;
    import javax.swing.JPanel;public class FrameTest extends JFrame { public FrameTest() {
    JPanel p = new JPanel();
    p.setBackground(Color.red);
    this.add(p, BorderLayout.CENTER);
    this.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) {
    System.out.println("clicked");
    } });
    } public static void main(String[] args) {
    FrameTest frame = new FrameTest();
    frame.setSize(400, 300);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }
      

  2.   

    确实会有这个问题,LS的可以再加上button看看。
      

  3.   

    2楼你的p里面是空的 这种情况下p的size好象是0 也就是p并没有覆盖整个frame
    不管你怎么点 都是点在frame上的!!
      

  4.   

    照样可以:
    package com.gui;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;public class FrameTest extends JFrame { public FrameTest() {
    JPanel p = new JPanel();
    p.add(new JButton("btn in panel"));
    p.setBackground(Color.red);
    this.add(p, BorderLayout.NORTH);
    this.add(new JButton("btn in JForm"), BorderLayout.SOUTH);
    this.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) {
    System.out.println("clicked");
    } });
    } public static void main(String[] args) {
    FrameTest frame = new FrameTest();
    frame.setSize(400, 300);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }
      

  5.   

    对 我也发现这个问题 这是  监听的是Button  而不是整个 frame等待高手解决
      

  6.   

    办法不是没有的
    package com.gui;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;public class FrameTest extends JFrame { public FrameTest() {
    JPanel p = new JPanel();
    p.add(new JButton("btn in panel"));
    p.setBackground(Color.red); this.add(p, BorderLayout.NORTH);
    this.add(new JButton("btn in JForm"), BorderLayout.SOUTH); // --------设置组建事件--------
    setMouseListener(this);
    // 获取当前面板
    Container contentPanel = this.getContentPane();
    // 获取当前面板中的所有组件
    Component[] comps = contentPanel.getComponents(); for (Component c : comps) {
    setMouseListener(c);
    // 如果当前面板中含有JPanel组件
    if (c instanceof JPanel) {
    Component[] compsInPanel = ((JPanel) c).getComponents();
    for (Component cc : compsInPanel) {
    setMouseListener(cc);
    }
    }
    }
    // ----------------------------
    } /**
     * 设置组件事件
     * 
     * @param c
     */
    public void setMouseListener(Component c) {
    c.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
    System.out.println("clicked");
    }
    });
    } public static void main(String[] args) {
    FrameTest frame = new FrameTest();
    frame.setSize(400, 300);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }
      

  7.   

    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
        public void eventDispatched(AWTEvent event) {
    ...
        }
    }, AWTEvent.MOUSE_EVENT_MASK);
      

  8.   

    其实  如果 你在你的程序  容器里再加个 JButton  你会发现上面的方法 是不行的
    其实  10楼上可以让面板  添加监听  但在JPanel上的物件 不能享受到监听   其实这是java为防止 出现监听混乱    所以你需要  对按钮也需要添加监听的话  需要  另外监听  另外我试试了11楼的   可以实现全部监听  功能和用法去看API 吧  我就能帮你到这了!!剩下的自己多试下!