关于Swing组件扩展,有什么经验法则?

3

当将一个类专门用于一个特定的Swing组件时,是更好地扩展该特定组件还是在内部构造并提供引用?

public class Foo extends JComponent{

}

或者

public class Foo{
    public JComponent getComponent(){
    }
}

编辑

我所说的“奉献”是指:

public class Foo{
    private static Foo INSTANCE;

    public static Foo getInstance(){
        if(INSTANCE == null){
            INSTANCE = new Foo();
        }
    }

    public void createAndShowComponent(){
        //do stuff
    }
}

createAndShowComponent()函数中,我创建了一个JComponent并添加了所有组件及其相应的监听器,而不需要暴露刚刚创建的组件的内部。

1
看到一些答案,我并不完全同意,所以我必须问你,你所说的“dedicating”到底是什么意思?...将一个类分配给特定的Swing组件。 - Boro
6个回答

7

+1 表示组合优于继承。这使得 API 更加清晰,因为您只公开了对新组件重要的方法。


4
我认为这并不是一个严格的规定。如果您正在创建一个通用组件以在多个地方使用,可以扩展任何JComponent;但如果它是一个独立的类用于单个应用程序(我认为大多数情况下都是这样的),那么使用组合可以大大解耦您的应用程序,并创建一个清晰的API。 - meverett
在需要组合时,请使用组合(大多数情况下)。当您正在实现新组件(例如分页的JTable)时,请使用扩展。这里的例外是扩展JApplet(因为我们需要它)。 - Anthony Accioly
1
抱歉,伙计们,我不明白为什么第二个选项会是最好的选择。这就像将控制器Foo与返回的JComponent视图混合在一起。对我来说感觉很糟糕。如果你返回组件,你仍然可以随心所欲地使用它。我看不出它给你带来了什么,但我看到它给你带来了什么负担。 (+/-0) - Boro
@meverett,你能看一下我的编辑并告诉我这是否仍然是正确的方法吗? - mre
@mre,这在一定程度上取决于你正在做什么,但通常是这样的。然后,您将为调用此类的任何调用者公开相应的公共方法。给定组件的任何侦听器、内部组件和属性都可以隐藏。 - meverett
显示剩余3条评论

3

我同意jzd的看法,一切取决于具体情况。

从技术角度来说,如果你在处理GUI方面,我认为最好在需要时构建组件,例如通过扩展JComponent来构建。这样你就可以简单地重复使用它们。

就个人而言,我不会在我的类中使用第二个选项。只有当有非常好的理由这样做时,例如允许用户修改您复杂日历组件中按钮的外观,我才会让一个类返回另一个组件。

基于一个非常简单的原因,每个组件类应该知道它拥有这个组件的原因,并且应该根据发生的情况适当地控制视图。因此,您将拥有适当的方法。


2

我认为扩展它会更好。能够使用其所有属性并像使用该对象一样使用它,使得使用起来更加简单。这只是我的个人意见。两种方式都很好。

如果你要将整个类都用于它,最好通过继承来实现。


2
如果您的对象是组件,那么请扩展它。如果不是,则使用组合。

1

这真的取决于你在做什么。例如,如果你想将新类包含在JPanel中,那么你需要扩展组件。如果你的代码可以将组件添加到GUI的正确位置,那么你就不必扩展它。


如果我想在JPanel上包含类的组件,我是否可以在类内部提供一个访问器来访问该组件? - mre
@mre,你完全可以像第二个例子那样做。但是这样可能会在新类和需要JComponent的类之间产生一些额外的耦合。有时候,通过扩展组件可以极大地简化代码。 - jzd

1
我会说没有一个。Swing组件非常(非常)丰富,可以按照任何方式自定义可视化(L&F)和行为(事件)。另一个要点是创建一组不同的组件并将它们布置在JPanel中。

既然不采用这两种方法,那么你如何创建Swing组件呢? - mre
我不会去"扩展"它们,我会去"配置"它们。在我看来,Swing编程并不意味着"扩展我",而是意味着"使用和配置我"。这取决于你的使用情况,但要小心,不要将Swing扩展到超过琐碎的事情之外... - PeterMmm
@mre 所以“dedicating”一个类意味着“创建”一个新组件? - Boro
你的意思是将“dedicating”翻译成“数据绑定”吗?我不理解在这个上下文中的“dedicating”。 - PeterMmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接