2015-03-02 63 views
0

以下是我的代碼,用於在我的JavaFx桌面應用程序中顯示彈出窗口。JavaFx顯示彈出窗口在客戶機上不起作用

public boolean popup(Object parent, ViewModelBase viewModel, AsyncCommand cancelCommand) { 

     javafx.scene.layout.Pane root = null; 
     try 
     {    
      if(!IOC.platformInfo.isPlatformThread()) 
      { 

       return PlatformUtil.runAndWait(()-> 
       { 
        return popup(parent,viewModel,cancelCommand); 
       }); 
      } 


      String name = viewModel.getClass().getSimpleName(); 
      name = Pattern.compile("(viewModel|Controller)$",Pattern.CASE_INSENSITIVE) 
        .matcher(name).replaceAll("View"); 

      FXMLLoader loader = new FXMLLoader(com.technoinn.videoprospector.ui.fx.service.WindowService 
      .class.getResource(String.format("/fxml/%s.fxml",name)) 
      , null, new JavaFXBuilderFactory(), new IocControllerFactory()); 
      if(viewModel instanceof ControllerBase) 
      { 
       loader.setController(viewModel); 
      } 
      root = loader.load();    

      if(!(viewModel instanceof ControllerBase)) 
      { 
       Object controller = loader.getController(); 
       if(controller instanceof ControllerBase) 
       { 
        ((ControllerBase)controller).setViewModel(viewModel); 
       } 
      } 




      jfxtras.scene.control.window.Window window = 
        new jfxtras.scene.control.window.Window(viewModel.getDisplayName()); 
      window.getContentPane().getChildren().add(root); 
      window.setPrefSize(root.getPrefWidth(), root.getPrefHeight()); 
      window.setMinSize(root.getPrefWidth(), root.getPrefHeight()); 
      CloseIcon closeIcon = new CloseIcon(window); 

      window.getLeftIcons().add(closeIcon); 

      Scene scene = new Scene(window); 
      // Scene scene = new Scene(root); 
      scene.getStylesheets().add(FxModule.StyleFile); 




      Stage stage = new Stage(StageStyle.UNDECORATED); 
      stage.setResizable(true); 

      stage.setMinWidth(root.getPrefWidth()); 
      stage.setMinHeight(root.getPrefHeight()); 

      viewModel.addPropertyChangeListener(ViewModelBase.closeCommand, 
      (x)-> 
      { 
       if(x.getNewValue()!=null && x.getNewValue()==Boolean.TRUE) 
       { 
        stage.close(); 
       } 
      }); 

      closeIcon.setCursor(Cursor.HAND); 

      closeIcon.setOnAction((x)-> 
      { 
       if(cancelCommand!=null) 
        cancelCommand.beginExecution(); 
       else 
        stage.close(); 
      }); 
      /* 

      stage.setOnCloseRequest((WindowEvent event) -> { 
       if(cancelCommand!=null) 
        cancelCommand.beginExecution(); 
       else 
        stage.close(); 
      });*/ 
      stage.setScene(scene); 
      stage.centerOnScreen(); 
      stage.initModality(Modality.APPLICATION_MODAL); 
      if(!parentWindows.isEmpty()) 
      { 
       stage.initOwner(parentWindows.peek()); 
       stage.initModality(Modality.WINDOW_MODAL); 
      } 
      parentWindows.push(stage); 

      stage.showAndWait(); 
      parentWindows.pop(); 
     }catch(Exception exp) 
     { 
      Logger.getGlobal().log(Level.SEVERE,"Error in popup",exp); 
     } 

     return true; 
    } 

問題是,彈出窗口在我的機器上顯示的很好,尺寸合適(開發機器)。但目標客戶機上的大小是不可預知的。有時它很小,有時它甚至不顯示彈出窗口的內容窗格。客戶機具有jRE 1.8_31。任何想法可能是錯的。客戶端機器大小與我的開發機器相同。 感謝

回答

0

最有可能你是太早調用下面的代碼:

 window.setPrefSize(root.getPrefWidth(), root.getPrefHeight()); 
    window.setMinSize(root.getPrefWidth(), root.getPrefHeight()); 

 stage.setMinWidth(root.getPrefWidth()); 
    stage.setMinHeight(root.getPrefHeight()); 

大多數佈局值被計算顯示場景之後。嘗試移動此類代碼後,致電

stage.showAndWait();