JavaFX

来源:互联网 发布:淘宝网店软文范例 编辑:程序博客网 时间:2024/04/28 16:01

效果

类似DOCK, 在主界面的右方弹出/收回,或者显示/隐藏
这里写图片描述


思路

  • 新创建一个dock_stage
  • dock_stage的模态类型为NONE或者WINDOW_MODAL(否则会挡住主stage)
  • 在主stage的scene的x、y属性增加监听器
  • 监听器动作是更新dock_stage的X和Y坐标

不足

  • 移动主stage时,dock_stage有非常轻微的脱离感,或许有其他更好的方法?比如bind? 欢迎高手指点哈!


实现代码

// MainScene.fxml用于主舞台// Dock_console.fxml用于子舞台public class MainScene extends Application {    private static Stage mainStage;    private static Scene mainScene;    private static Stage dockStage;    private static DoubleProperty docker_X;    private static DoubleProperty docker_Y;    @Override    public void start(Stage primaryStage) throws Exception {        mainStage = primaryStage;        final Parent root = FXMLLoader.load(getClass().getResource("MainScene.fxml"));        mainScene = new Scene(root);        mainStage.initStyle(StageStyle.DECORATED);        mainStage.setScene(mainScene);        mainStage.setTitle("NTT");        mainStage.show();        // 获取主stage的位置        docker_X = new SimpleDoubleProperty( (mainScene.getWindow().getX() +         mainScene.getWidth())+2.0);        docker_Y = new SimpleDoubleProperty(mainScene.getWindow().getY());        // 绑定位置, DOCK跟随主stage        mainScene.getWindow().xProperty().addListener(        (ObservableValue<? extends Number> observable,         Number oldValue, Number newValue) -> {            docker_X.set(docker_X.getValue() + newValue.doubleValue() -             oldValue.doubleValue());            dockStage.setX(docker_X.getValue());        });        mainScene.getWindow().yProperty().addListener(        (ObservableValue<? extends Number> observable,         Number oldValue, Number newValue) -> {            docker_Y.set(docker_Y.getValue() + newValue.doubleValue() -             oldValue.doubleValue());            dockStage.setY(docker_Y.getValue());        });    }    @FXML    void showOrClose() {        if (dockStage != null && dockStage.isShowing()) {            dockStage.close();            return;        }        Parent root = null;        try {            root = FXMLLoader.load(getClass().getResource("Dock_console.fxml"));            final Scene scene = new Scene(root);            dockStage = new Stage();            dockStage.initStyle(StageStyle.DECORATED);            dockStage.initModality(Modality.NONE);  // 重要!            dockStage.setX(docker_X.getValue());            dockStage.setY(docker_Y.getValue());            dockStage.setScene(scene);            dockStage.setTitle("console");            dockStage.show();        } catch (IOException e) {            e.printStackTrace();        }    }}

友情提示 : 转摘请注明出处 , 谢谢!

原创粉丝点击