使用GUI的内部类的标准?

时间:2009-12-12 17:49:12

标签: java swing standards inner-classes

我想知道内部类的标准实践(在Java中,但我认为它适用于所有OO语言)。 所以我有一个JFrame子类ControllerWindow,它包含一个我绘制的JPanel子类MapPanel(因此它需要覆盖paintComponent方法),并且需要实现一个鼠标监听器。我当前的解决方案是在一个单独的类中实现MouseListener MapPanel,但是当我向那个管理我的课程的人展示它时,他似乎认为(我们有一点语言障碍)这应该在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以外的任何内容。

5 个答案:

答案 0 :(得分:8)

通常使用匿名内部类作为事件侦听器,因为代码通常非常简单(因此单独的类可能过度杀伤)并且使处理程序代码“接近”注册侦听器的代码可以提高人们的可读性试图理解你的代码,因为与事件相关的所有代码都在一个地方。

编辑:对于只实现一个侦听器方法的类尤其如此。对于像MouseListener这样的多方法接口,可能不那么真实,因为实现完整接口的类将更加冗长。

答案 1 :(得分:4)

我认为你如何处理这个问题(正如Tom Hawtin评论的那样,GUI标准=泥浆),因为你在单个类中复杂了类的数量与复杂性。如果您只想为演示生成代码,则单个文件可能最简单。如果你想要将生产和修改/维护的代码随着时间的推移,抽象到不同的类几乎肯定是你想要的方式。

例如,如果您将MapPanel作为内部类嵌入到ControllerWindow中,然后想要用不同类型的MapPanel替换它,那么您需要对ControllerWindow进行大量更新,而不是仅仅为另一个组件交换MapPanel类型。

使用MouseListener,我倾向于将它包含在MapPanel中,如果它专门处理该组件的事件(也就是说,如果只有MapPanel“知道”点击的含义,它应该是处理该点击的那个)。我肯定不会把它放在ControllerWindow中,因为那时你从MapPanel“泄漏”了实现细节。 (我能想到的唯一情况是:除了你的MapPanel之外,你还有多种面板类型,所有这些都需要以相同的方式响应点击,所以不要在每个面板中实现,你可以让ControllerWindow这样做。但即使这样,我不确定代码应该在ControllerWindow中。)

MapPanel的鼠标侦听器是否是MouseListener的内部类实现,或MapPanel是否实现它(如上面的代码中所示)可能归结为您喜欢哪种样式的问题。

答案 2 :(得分:1)

如果内部类具有更简单的语法,那么它会更好。

button1.click( function(event){ do something x...  } );
button2.click( function(event){ do something y...  } );
radio2.check ( function(event){ do something z... } );

java 7可能会给我们这样的东西并改变整个情况。就像现在一样,使用大量的匿名内部类可能会弄乱代码并使其无法读取。你应该选择哪种风格能让你的代码变得美观和清晰。

答案 3 :(得分:0)

由于需要多个事件处理,因此需要匿名内部类。匿名类可以在类中,方法中,在参数中的任何地方编写。因此,为了避免为每个监听器创建许多类,匿名是首选。

答案 4 :(得分:0)