我想知道内部类的标准实践(在Java中,但我认为它适用于所有OO语言).
所以我有一个JFrame子类ControllerWindow,它包含一个我绘制的JPanel子类MapPanel(因此它需要覆盖paintComponent方法),并且需要实现一个鼠标监听器.我当前的解决方案是将MapPanel放在一个单独的类中实现MouseListener,但是当我向那个管理我的课程的人展示它时,他似乎认为(我们有一点语言障碍)这应该在一个内在ControllerWindow中的类或者至少MouseListener应该是一个内部类.
所以我的问题是这里的标准解决方案是什么,将MouseListener放在内部类中,将JPanel放在不同的内部类中,还是放在它的单独类中? JPanel在一个内部类中实现MouseListener?为什么?
对我来说最重要的是它有效,但我想知道并理解这些事情背后的标准做法,如果可能的话.
编辑:下面的当前代码的非常简化版本.
class ControllerWindow extends JFrame{
...
MapPanel drawPanel = new MapPanel();
...
}
和一个单独的类:
class MapPanel extends JPanel implements MouseListener{
...
public void paintComponent(Graphics g){
...//fillRects etc.
}
//MouseListener methods
public void mouseReleased(MouseEvent e){
requestFocus();
...
repaint()
...
}
public void mousePressed(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
}
也可能是这种情况,将两个类放在同一个文件中是可以接受的吗?我没有设想将MapPanel用于ControllerWindow以外的任何其他内容.
例如,如果您将MapPanel嵌入到ControllerWindow中作为内部类,然后又想要用不同类型的MapPanel替换它,那么您需要对ControllerWindow进行大量更新,而不是仅仅针对不同的组件类型交换MapPanel.
使用MouseListener,我倾向于将它包含在MapPanel中,如果它专门处理该组件的事件(也就是说,如果只有MapPanel“知道”点击的含义,它应该是处理该点击的那个).我肯定不会把它放在ControllerWindow中,因为那时你从MapPanel“泄漏”了实现细节. (我能想到的唯一情况是:除了你的MapPanel之外,你还有多种面板类型,它们都需要以相同的方式响应点击,所以不要在每个面板中实现,你可以让ControllerWindow这样做.但即使这样,我不确定代码应该在ControllerWindow中.
MapPanel的鼠标侦听器是否是MouseListener的内部类实现,或者MapPanel是否实现它(如上面的代码中所示)可能归结为您喜欢哪种样式的问题.