Java 什么';关于Swing组件扩展的经验法则是什么?

Java 什么';关于Swing组件扩展的经验法则是什么?,java,swing,extend,jcomponent,Java,Swing,Extend,Jcomponent,将类专用于特定Swing组件时,最好是扩展该特定组件,还是在内部构造该组件并提供引用 public class Foo extends JComponent{ } 或 public class Foo{ public JComponent getComponent(){ } } 编辑 这就是我所说的奉献的意思 public class Foo{ private static Foo INSTANCE; public static Foo getInstan

将类专用于特定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表示组合优于扩展。它使API更加干净,因为您只公开对新组件重要的方法,这实际上取决于您在做什么。例如,如果希望在JPanel上包含新类,则需要扩展该组件。如果您的代码可以将组件添加到GUI上的正确位置,那么您不必扩展它。

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

我同意jzd,这要看情况而定

从技术上讲,在我看来,如果您正在处理GUI,最好在需要时构建组件,例如扩展JComponent。这样您就可以简单地重用它们

就我个人而言,我永远不会在课堂上使用第二个选项。我只会让一个类返回另一个组件,只要有很好的理由这样做,例如,允许用户修改复杂日历组件中的按钮外观


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

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


如果你把整个班级都奉献给它。如果您的对象是一个组件,那么最好通过继承来实现它。

而不是扩展它。如果没有,则使用组合。

如果我想在
JPanel
上包含该类的组件,难道我不能在该类中提供该组件的访问器吗?@mre,您完全可以像第二个示例那样。但是,在新类和需要JComponent的类之间可能会有一些额外的耦合。有时它可以大大简化代码以扩展组件。这两种方法都不适用吗?那么您如何创建Swing组件呢?我不会,我将“配置”它们。IMHO Swing编程并不意味着“扩展我”,而是意味着“使用和配置我”。取决于您的用例,但请注意开始将Swing扩展到琐碎的事情之外…@mre so
专用
一个类意味着
创建一个新组件?您的意思是“专用”为“数据绑定”吗?我不理解在这种情况下的“奉献”。+1,延伸摆动组件的曝光正是我问这个问题的原因。我不认为这是一个硬性规定。如果要在许多地方使用通用组件,请务必扩展JComponent,但如果它是单个应用程序的独立类(我认为大多数应用程序都是这样),那么它将大大解耦应用程序的一部分以使用composition,并创建一个干净的API+1。在需要构图时使用构图(大多数情况下)。在实现新组件(例如,分页JTable)时使用扩展。这里的例外是扩展JApplet(因为我们也需要)。对不起,伙计们,我不明白为什么第二种选择会是永远的选择。这就像将控制器Foo与返回的JComponent视图混合一样。我感觉很糟糕。如果返回组件,您仍然可以使用它执行任何操作。我看不出它给你带来了什么,但我知道它给你带来了什么负担。(+/-0)波罗,你永远无法阻止某人做他们不该做的事。使用这样的构图只会让它变得更加困难。通过返回一个JComponent,他们将不得不将它转换为其他组件,以在其上执行大多数操作。你只是介绍一些步骤,让某人在做不应该做的事情之前三思而后行。你也在强迫自己设计/思考某些组件的api到底应该是什么,而不是暴露它是如何实际实现的,以及swing组件上的500多个函数调用。看到一些我并不完全同意的答案,我必须问你,你所说的奉献
,到底是什么意思。。。。特定Swing组件的类。