我有这门课,让我们说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问题。
答案 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
实例。