我想知道内部类的标准实践(在Java中,但我想它适用于所有OO语言)。
因此,我有一个JFrame子类ControllerWindow
,其中包含一个我要绘制的JPanel子类MapPanel
(因此它需要覆盖paintComponent方法)并且需要实现一个鼠标监听器。我当前有效的解决方案是将MapPanel
放在实现MouseListener的单独类中,但是当我向有一天学习类(class)的那个人展示此内容时,他似乎认为(我们有点语言障碍)这应该在内部ControllerWindow
中的class或至少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
以外的任何其他功能。 最佳答案
我认为您的处理方式有些武断(正如Tom Hawtin所评论的那样,GUI standard = mud),因为您要权衡类数的复杂性和单个类的复杂性。如果您只想为演示生成代码,则单个文件可能是最简单的。如果您想要将要投入生产的代码并随着时间的推移进行修改/维护,那么将其抽象到不同的类中几乎肯定是您想要的方式。
例如,如果您将MapPanel作为内部类嵌入到ControllerWindow中,然后在以后想用其他类型的MapPanel替换它,则对ControllerWindow进行了大量更新,而不仅仅是将MapPanel换成其他组件类型。
使用MouseListener时,如果它正在处理专门针对该组件的事件,则倾向于将其包含在MapPanel中(也就是说,如果仅MapPanel“知道”单击的含义,则应该是处理该单击的对象)。我绝对不会将其放在ControllerWindow中,因为那样的话您就从MapPanel中“泄漏”了实现细节。 (我能想到的唯一情况是:除了您的MapPanel之外,您还有多个面板类型,所有这些类型都需要以相同的方式响应点击,因此您可以让ControllerWindow做到这一点,而不是在每个面板中实现。 ,我不确定代码是否应该在ControllerWindow中。
MapPanel的鼠标监听器是MouseListener的内部类实现,还是MapPanel实现(如上面的代码),可能取决于您喜欢哪种样式的问题。