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();
首先是mouse pressed的事件的
然后其source的ancestor组件为该jpanel的
就说明该事件是符合要求的事件,取出source就是该组件。
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);
}
}
楼主还是按照gtlang78的方法吧。不想多费周折了。
大家知道,glasspane是组建最外层的一块"玻璃",不过一般是处于unvisible的.
当你将它设为visible后,就可以用它来拦截所有的鼠标事件了.
在glasspane上加一个MouseListener,在mouseClicked(MouseEvent e) 方法里通过e.getPoint()得到鼠标所在位置,然后通过SwingUtilities.getDeepestComponentAt(..)方法就可以得到当前鼠标点击的组件了.大概思路是这样,不过其实里面还有个难点,就是glasspane把所有的鼠标事件拦截了,你的自己通过某种方式把这些事件重新传到里面去.
/** 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)
}
};
}