我想知道内部类的标准实践(在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实现(如上面的代码),可能取决于您喜欢哪种样式的问题。

10-04 18:35