1

使用单例创建新窗口是一种好习惯吗?

我有主窗口,我想创建另一个。此窗口仅用于更改主窗口中的属性。

我的代码:

主窗口

public class MainWindow  {

private StackPane root = new StackPane();
private Stage primaryStage = new Stage();

  public void run(){

    primaryStage.setTitle("v0.2-alpha");
    Scene scene = new Scene(root, 600, 400);
    scene.getStylesheets().addAll("css/style.css"); 

    MainMenu mmb = new MainMenu();     

    VBox vBox = new VBox();
    vBox.getChildren().add(mmb.createMenuBar());

    ISplitPane lsp = new SplitPaneLeftImpl();
    ISplitPane csp = new SplitPaneCenterImpl();
    ISplitPane rsp = new SplitPaneRightImpl();

   HBox hboxpane = new HBox();
   hboxpane.getChildren().addAll(spl.createSplitPane(), spc.createSplitPane(), spr.createSplitPane());

    root.getChildren().addAll(vBox,hboxpane);
    primaryStage.setScene(scene);
    primaryStage.show();
}

}

创建新的窗口类

public interface IStage {
    public void createStage();
}



class StageOptionsImpl implements IStage{
private OptionsStage(){}

private Stage stageOptions = new Stage();

private static StageOptionsImpl os = null;

public static StageOptionsImpl getInstance(){
    if(os == null){
        synchronized(StageOptionsImpl.class){
            if(os == null){
                os = new StageOptionsImpl();
            }
        }
    }
    return os;
}

@Override
public void createStage(){
 GridPane gp  = new GridPane();
    TabPane tabPane = new TabPane();
    tabPane.setSide(Side.LEFT);                

    Tab tabSecurity = new Tab("Security");
    tabSecurity.setContent(new SecurityTab().tabCreate());

    Tab tab2 = new Tab("System Data");
    tab2.setContent(new DataTab().tabCreate());

    Tab tab3 = new Tab("tab 3");
    tab3.setContent(new SecurityTab().tabCreate());

    tabPane.getTabs().addAll(tabSecurity, tab2, tab3);

    Scene sceneOptions = new Scene(tabPane, 400, 300, Color.AQUA);
    stageOptions.setScene(sceneOptions);
    stageOptions.show();
}
}
4

3 回答 3

1

如果它只从那里使用,你为什么要一个单例。单例的全部意义在于您可以在任何地方使用它的相同实例。

于 2012-08-10T23:14:14.420 回答
0

管理这些窗口的最佳方法通常是创建一个类来管理程序中的所有窗口/面板。

如果你想打开名为“ClientForm”的面板,它应该有一个这样的方法:

public void OpenClientForm(){

// Set the other forms to their default form(when != null) and set their visibility as false (when != null).
    RestorePanels();
 // In case it hasn't been created yet 
 if (ClientForm == null){
 // calls a factory that creates the form.
 }
 else{
 // Set the form as visible
 }
}

在程序内部“处理”面板/表单时,您应该有一种方法可以清除面板,强制它们恢复到原始状态并将它们的可见设置为 false。

Swing 有很多问题,处理表单并重新创建它们可能会在您的界面中弄乱很多东西。所以,回到你的问题......实现一个单例或一个工厂来管理你的表单应该是最好的方法。希望这可以帮助。

于 2012-08-10T23:56:04.940 回答
0

使用单例创建新窗口是一种好习惯吗?

好吧,这归结为一个设计问题。

如果您只想Component在您的应用程序中拥有一个共享的 a 实例,那么我会说单例不是一个坏方法。它将迫使这种选择。

但是,如果您想要显示相同的多个实例,Component但想要一种更简单的方式来构造它,或者想要通过 API 公开一个非具体的接口,那么Factory模式将是更好的选择。

于 2012-08-10T23:11:21.517 回答