并且能获得这个组件的实例,谢谢

解决方案 »

  1.   

    Toolkit.getDefaultToolkit().addAWTEventListener()
      

  2.   

    所有的原生事件都在这儿流过,你只要filter一下就行了,
    首先是mouse pressed的事件的
    然后其source的ancestor组件为该jpanel的
    就说明该事件是符合要求的事件,取出source就是该组件。
      

  3.   

    但是组件我并没有定义监听器,这样还会有source吗?
      

  4.   

    没有定义监听器也有,这儿的事件是AWTEvent,是原生事件。
      

  5.   

    我试了一下,当我监听MOUSE_EVENT_MASK事件时,点击一个组件会多次触发监听器,因为所有的鼠标事件都被监听了--获得焦点、失去焦点、鼠标移动,但我只想得到一次,即鼠标点击的时候,但我看了awtevent,没有这种事情,另外,jlabel又需要什么事件去监听呢?MOUSE_EVENT_MASK 对此没有反应。
      

  6.   

    我点击jlabel的时候,source居然是其所在的applet
      

  7.   

    还是在每个Component上都添加MouseListener比较简单,只要覆盖 addImpl()方法就可以了。import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.event.*;import javax.swing.*;public class T extends JPanel implements MouseListener {
    public T() {
    this.addMouseListener(this);
    }

    @Override
    protected void addImpl(Component comp, Object constraints, int index) {
    super.addImpl(comp, constraints, index);
    comp.addMouseListener(this);
    }

    public void mouseClicked(MouseEvent e) {
    System.out.println("点击了 " + e.getComponent());
    } public void mouseEntered(MouseEvent e) {
    } public void mouseExited(MouseEvent e) {
    } public void mousePressed(MouseEvent e) {
    } public void mouseReleased(MouseEvent e) {
    }

    public static void main(String[] args) {
    JPanel p = new T();
    for (int i = 0; i < 10; i++) {
    p.add(new JLabel("Label " + (i+1)));
    }

    JFrame f = new JFrame();
    f.getContentPane().add(p, BorderLayout.CENTER);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    }
    }
      

  8.   

    按理说能按照Toolkit.getDefaultToolkit().addAWTEventListener()方式实现。不过具体还是要费一番周折。
    楼主还是按照gtlang78的方法吧。不想多费周折了。
      

  9.   

    呵呵,其实还有一种实现方式啊:使用JFrame中的GlassPane!
    大家知道,glasspane是组建最外层的一块"玻璃",不过一般是处于unvisible的.
    当你将它设为visible后,就可以用它来拦截所有的鼠标事件了.
    在glasspane上加一个MouseListener,在mouseClicked(MouseEvent e) 方法里通过e.getPoint()得到鼠标所在位置,然后通过SwingUtilities.getDeepestComponentAt(..)方法就可以得到当前鼠标点击的组件了.大概思路是这样,不过其实里面还有个难点,就是glasspane把所有的鼠标事件拦截了,你的自己通过某种方式把这些事件重新传到里面去.
      

  10.   

    public class TestPanel extends javax.swing.JPanel implements java.awt.event.MouseListener{  
        /** Creates new form TestPanel */
        public TestPanel() {
            initComponents();
            addMouseListener(this);
            jButton1.addMouseListener(actonForButton);
            jButton2.addMouseListener(actonForButton);
            jButton3.addMouseListener(actonForButton);
            jButton4.addMouseListener(actonForButton);
        }
        
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        private void initComponents() {
            jButton1 = new javax.swing.JButton();
            jButton2 = new javax.swing.JButton();
            jButton3 = new javax.swing.JButton();
            jButton4 = new javax.swing.JButton();
            
            setLayout(new java.awt.GridBagLayout());
            java.awt.GridBagConstraints gridBagConstraints1;
            
            jButton1.setText("jButton1");
            jButton1.setName("button one");
            gridBagConstraints1 = new java.awt.GridBagConstraints();
            gridBagConstraints1.gridx = 0;
            gridBagConstraints1.gridy = 0;
            gridBagConstraints1.insets = new java.awt.Insets(10, 10, 10, 10);
            add(jButton1, gridBagConstraints1);
            
            jButton2.setText("jButton2");
            jButton2.setName("button two");
            gridBagConstraints1 = new java.awt.GridBagConstraints();
            gridBagConstraints1.gridx = 1;
            gridBagConstraints1.gridy = 0;
            gridBagConstraints1.insets = new java.awt.Insets(10, 10, 10, 10);
            add(jButton2, gridBagConstraints1);
            
            jButton3.setText("jButton3");
            jButton3.setName("button three");
            gridBagConstraints1 = new java.awt.GridBagConstraints();
            gridBagConstraints1.gridx = 0;
            gridBagConstraints1.gridy = 1;
            gridBagConstraints1.insets = new java.awt.Insets(10, 10, 10, 10);
            add(jButton3, gridBagConstraints1);
            
            jButton4.setText("jButton4");
            jButton4.setName("button four");
            gridBagConstraints1 = new java.awt.GridBagConstraints();
            gridBagConstraints1.gridx = 1;
            gridBagConstraints1.gridy = 1;
            gridBagConstraints1.insets = new java.awt.Insets(10, 10, 10, 10);
            add(jButton4, gridBagConstraints1);
            
        }
        public void mouseExited(java.awt.event.MouseEvent mouseEvent) {}
        public void mousePressed(java.awt.event.MouseEvent mouseEvent) {}
        public void mouseReleased(java.awt.event.MouseEvent mouseEvent) {  }
        public void mouseClicked(java.awt.event.MouseEvent mouseEvent) {
            if(mouseEvent.getComponent()==this)System.out.println("panel clicked!");
            else System.out.println("button clicked! button name="+mouseEvent.getComponent().getName());
        }
        public void mouseEntered(java.awt.event.MouseEvent mouseEvent) {    }
        
        public static void main(String[] args) {
            TestPanel panel=new TestPanel();
            javax.swing.JFrame frame=new javax.swing.JFrame("test");
            frame.setContentPane(panel);
            frame.pack();
            frame.setBounds(200,200,700,400);
            frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
        // Variables declaration - do not modify
        private javax.swing.JButton jButton1;
        private javax.swing.JButton jButton2;
        private javax.swing.JButton jButton3;
        private javax.swing.JButton jButton4;
        // End of variables declaration
        java.awt.event.MouseAdapter actonForButton=new java.awt.event.MouseAdapter(){
            public void mouseClicked(java.awt.event.MouseEvent mouseEvent) {
                java.awt.Component c=mouseEvent.getComponent();
                System.out.println(c.getName()+" clicked!");
                javax.swing.JPanel p=(javax.swing.JPanel)c.getParent();
                java.awt.event.MouseListener[] ms=p.getMouseListeners();
                for(int i=0;i<ms.length;i++)ms[i].mouseClicked(mouseEvent);//在本例可直接调用 this.mouseClicked(mouseEvent)
            }
        };
    }
      

  11.   

    参照gtlang78的方法,可以实现,可以遍历applet的成员变量,然后添加MouseListener,dejinzhao那个是一种手动逐个添加的办法。这个帖子含金量这么高,我再加80分.