在这种情况下,静态实用方法不是最好的方法吗?

时间:2011-05-31 17:36:47

标签: java swing user-interface static-methods

我有这门课,让我们说Foo。此课程负责创建/显示JFrame,这需要重度自定义。

public class Foo{
    private static JFrame frame;

    public static void createAndShowFrame(){
        //do stuff
    }

    public static JFrame getFrame(){
        return frame;
    }
}

我还有另一个类,我们说Launcher,它是应用程序的入口点。该类负责启动GUI的构建

public class Launcher{
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                Foo.createAndShowFrame();
            }
        });
    }
}

设计问题是getFrame()。此方法是必需的,因为其他对话框要求将其作为父框架。不幸的是,这暴露了框架,似乎使静态实用方法无效。

我想我的问题是,是否有更合理的设计方法?我有意义吗?我基本上想要创建并显示一个框架,而不必extend

请参阅我的Rule of Thumb问题。

2 个答案:

答案 0 :(得分:1)

我没有看到使用invokeLater() 的优势(编辑 - 在这种情况下(因为你是从main()调用的)。如果你有重的话要进行GUI处理,只需在主线程上执行(因为你必须这样做)。如果大部分工作都可以在后台完成,那么在后台完成并在主线程上发布结果。(使用invokeLater() )。 [这部分只是我的观点,不是基于某些文档等...]

最后,如果您不想公开框架,请创建一个方法setChildComponent(JComponent component),该方法将收到JComponent并在内部将框架设置为其父框架。这样就可以避免暴露私有JFrame。

答案 1 :(得分:1)

独立于暴露JFrame或封装它的问题,为什么这个类(方法/字段)必须是静态的?面向对象的方法是让它们具有普通(实例)方法:

public class FrameCreator {
    private JFrame frame;

    public void createAndShowFrame(){
        //do stuff
    }

    public JFrame getFrame(){
        return frame;
    }
}

然后在你的启动器类中,你将创建这个类的对象并调用它的方法:

public class Launcher{
    public static void main(String[] args){
        final FrameCreator f = new FrameCreator();
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                f.createAndShowFrame();
            }
        });
    }
}

如果您需要从其他地方访问创建的框架,请将此代码传递给创建框架的FrameCreator实例。