public JComponent getUI(){

JPanel panel=new JPanel();
mainPanel.add(panel,BorderLayout.CENTER);

panel.setLayout(new GridLayout(2,1));
panel.add(bomBox);
bomBox.setBackground(Color.white);
Font f=new Font("SansSerif", Font.BOLD, 18);
bomBox.setFont(f);
bomBox.setOpaque(true);
JPanel subpanel=new JPanel();
subpanel.setLayout(new GridLayout(subtasks.size(),1));
panel.add(subpanel);

for(Map.Entry<Integer,SubTaskLabel> subs:subtasks.entrySet()){
JRadioButton box=new JRadioButton();
box.setText(subs.getValue().getLevel()+"."+subs.getValue().getContent());
subpanel.add(box);
box.setBackground(Color.white);
box.setOpaque(true);

}

panel.setBorder(LineBorder.createGrayLineBorder());
mainPanel.add(controlpanel,BorderLayout.EAST);


// mainPanel.addMouseMotionListener(new MouseMotionAdapter(){
//
//// public void mouseEntered(MouseEvent e) {
//// System.out.println("mousemovein");
//// controlpanel.setVisible(true);
//// //mainPanel.updateUI();
//// //mainPanel.repaint();
//// }
////
//// public void mouseExited(MouseEvent e) {
//// controlpanel.setVisible(false);
//// //mainPanel.updateUI();
//// //mainPanel.repaint();
//// }
//
// public void mouseMoved(MouseEvent e){
// System.out.println("x="+e.getX()+";y="+e.getY());
// }
//
// });

//mainPanel.setOpaque(true);

return mainPanel;

}我写的组件中,有个部分是一个JPanel中上半部分是JComboBox,下半部分是一组JRadioButton.然后我想
监听鼠标在这个JPanel中的移动,并作出相应的处理(标注掉的部分).但实际测试的时候,不管怎么动,后台
都不输出坐标,只有在JPanel边缘移动时,才会输出坐标.请高手指点,如何侦听已经填加满组件的JPanel上的
鼠标移动?

解决方案 »

  1.   

    for(Component c:mainPanel.getComponents()){
        c.addMouseMotionListener(...);
    }
      

  2.   

    因为你只是Panel加了监听,而Panel上的其他组件没加监听,当鼠标进入Panel上的其他组件时,Mouse事件是发生在其他组件上而不是Panel上,就好像你在桌子上铺了张纸,你把手放在上面,其实手是放在纸上而不是桌子,所以,你要把Panel上的组件也加上相应的监听
    最方便的做法
    MouseMotionAdapter mma = new MouseMotionAdapter() {
        ....
    };
    panel.addMouseMotionListener(mma);
    addAllMouseMotionListener(panel, mma);void addAllMouseMotionListener(Container con, MouseMotionAdapter mma) {
        for (Component c : panel.getComponents()) { //容器上的所有组件
            if (c instanceof Container) { //该组件是容器的话
                addAllMouseMotionListener(c, mma); //递归
            }
            c.addMouseMotionListener(mma);
        }
    }
      

  3.   


    把你Jpanel上的所有组件加上监听