2011-05-27 41 views
3

将某个类专用于特定的Swing组件时,最好是指定该特定组件,还是在内部构建它并提供参考?关于Swing组件扩展,什么是经验法则?

public class Foo extends JComponent{ 

} 

OR

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

看到一些我不完全同意的答案我必须问你这个“献给”是什么意思? ....一个特定的Swing组件的类。 – Boro 2011-05-27 17:48:14

回答

7

+1对于构成扩展。它使得API更清洁,因为你只公开哪些方法对你的新组件很重要

+0

+1,扩展Swing组件的风险正是我问这个问题的原因。 – mre 2011-05-27 17:39:17

+4

我不认为这是一个强硬的规则。如果你想让一个通用组件在很多地方使用,那么一定要扩展任何JComponent,但是如果它是一个单独的应用程序的独立类,我认为这个应用程序最常用,而不是它极大地分离了你的应用程序的一部分来使用组合并创建一个干净的API – meverett 2011-05-27 17:51:54

+0

+1。当你需要作文时(大部分时间)使用作文。当你实现一个新的组件时(比如分页的JTable),使用扩展。这里的例外是扩展JApplet(因为我们也需要)。 – 2011-05-27 17:53:25

1

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

+0

,我能不能在类中为该组件提供一个访问器? – mre 2011-05-27 17:35:22

+0

@mre,你绝对可以喜欢你的第二个例子。但是,你可能会在你的新类和需要JComponent的类之间有一些额外的耦合。有时候它可以大大简化你的代码来扩展组件。 – jzd 2011-05-27 17:38:49

1

我会说他们都没有。 Swing组件非常(非常)丰富,可以以任何方式定制可视化(L & F)和行为(事件)。另一点是创建一组不同的组件并将它们放在JPanel中。

+0

既不办法?那么你如何去创建Swing组件? – mre 2011-05-27 17:37:31

+0

我不会,我会“配置”他们。恕我直言,Swing编程并不意味着“延长我”,这意味着“使用和配置我”。取决于你的用例,但要注意开始扩展Swing以外的东西...... – PeterMmm 2011-05-27 17:48:31

+0

@mre所以'奉献'一个类意味着'创造'一个新的组件? – Boro 2011-05-27 17:49:49

3

我同意jzd这一切都取决于。从技术上讲,如果你在处理GUI时,我认为最好是在你需要的时候构建组件,例如扩展JComponent等等组件。这样你可以简单地重用它们。

就我个人而言,我绝对不会在我的班级中使用第二个选项。只有在有充分理由的情况下,我才会有一个类返回另一个组件。使用户能够修改复杂日历组件中的按钮外观。

出于一个非常简单的原因,每个组件类应该知道它具有这个组件,并且它应该相应地控制视图以发生什么。因此你会有适当的方法。

2

我想说延长它会更好。能够使用它的所有属性并像使用它一样,该对象使得它更容易使用。只是我的个人意见。两种方式都很好。

如果你正致力于整个班级。也可以通过继承来实现。

2

如果你的对象是一个组件,比扩展它。如果不是,则使用合成。