ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaFx之场景交互(二十一)

2021-11-18 21:04:18  阅读:160  来源: 互联网

标签:javafx JavaFx Button 二十一 public import new 交互 button


JavaFx之场景交互(二十一)

有parent、son两个父子窗口,父窗口可以操作子窗口,父子可以相互调用对方的对象,下面我给出两种方案,我推荐使用第二种

一、构造传参

参数比较多的话代码不优雅、而且不太方便维护。

package top.oneit.jdownload.test;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

/**
 * @author lingkang
 */
public class MyParent extends Application {
    private MySonA sonA;
    private Button button;

    @Override
    public void start(Stage primaryStage) throws Exception {
        button = new Button("open子窗口A");
        button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                if (sonA==null){
                    sonA = new MySonA(primaryStage,button);
                    sonA.show();// 显示子窗口
                }else{
                    sonA.show();
                }
                // 调用子接口对象
                System.out.println(sonA.getButton().getText());
            }
        });

        Button closeSon = new Button("关闭子窗口");
        closeSon.setLayoutY(40);
        closeSon.setOnAction(event -> {
            sonA.close();
        });

        AnchorPane anchorPane = new AnchorPane(button, closeSon);
        anchorPane.setPrefWidth(400);
        anchorPane.setPrefHeight(300);
        primaryStage.setScene(new Scene(anchorPane));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

package top.oneit.jdownload.test;

import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

/**
 * @author lingkang
 */
public class MySonA extends Stage {
    private Stage parent;
    private Button button;

    public MySonA(Stage parent,Button parentButton) {
        this.parent = parent;
        Label label = new Label("我是儿子A");
        button = new Button("关闭父窗口");
        button.setOnAction(event -> {
            System.out.println(parent.getTitle());
            parent.close();
        });
        button.setLayoutY(40);

        Button open = new Button("打开父窗口");
        open.setLayoutY(80);
        open.setOnAction(event -> {
            parentButton.setText("子调用父的对象");// 父子传参,构造方法
            parent.show();
        });

        Button exit = new Button("exit");
        exit.setLayoutY(120);
        exit.setOnAction(event -> {
            System.exit(0);
        });

        AnchorPane pane = new AnchorPane(label, button, open, exit);
        pane.setPrefWidth(300);
        pane.setPrefHeight(200);
        setScene(new Scene(pane));
    }

    public Button getButton() {
        return button;
    }

    public void setButton(Button button) {
        this.button = button;
    }
}

效果:
在这里插入图片描述

二、继承公共类

灵活,注意,创建多个同样的窗口带来的问题,还有获取对应stage为空的问题!提前判空
启动入口

import javafx.application.Application;
import javafx.stage.Stage;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * @author lingkang
 * @date 2021/11/18
 */
public class MyApp extends Application {
    public static ConcurrentMap<String, Stage> stages = new ConcurrentHashMap<>();

    @Override
    public void start(Stage primaryStage) throws Exception {
        new MyParent();//显示父窗口
    }

    public static void main(String[] args) {
        launch(args);
    }
}

公共类

import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

/**
 * @author lingkang
 * @date 2021/11/18
 */
public class MyStageCommon extends Stage {

    public MyStageCommon() {
        super();
        // 创建窗口时加入
        MyApp.stages.put(getClass().getName(), this);
        // x 掉窗口时将它移除
        setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {
                MyApp.stages.remove(getClass().getName());
            }
        });
    }

    @Override
    public void close() {
        super.close();
        MyApp.stages.remove(getClass().getName());
    }

    /**
     * 获取对象,,注意返回空值
     */
    public <T> T getStage(Class<T> clazz) {
        Stage stage = MyApp.stages.get(clazz.getName());
        if (stage == null)
            return null;
        return (T) MyApp.stages.get(clazz.getName());
    }
}

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;

/**
 * @author lingkang
 */
public class MyParent extends MyStageCommon {
    public Button button;

    public MyParent() {
        setTitle("父窗口!");
        button = new Button("open子窗口A");
        button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                if (getStage(MySonA.class) == null) {
                    new MySonA().show();// 显示子窗口
                } else {
                    getStage(MySonA.class).show();
                }
                // 调用子接口对象
                System.out.println(getStage(MySonA.class).button.getText());
            }
        });

        Button closeSon = new Button("关闭子窗口");
        closeSon.setLayoutY(40);
        closeSon.setOnAction(event -> {
            if (getStage(MySonA.class) != null)
                getStage(MySonA.class).close();
        });

        AnchorPane anchorPane = new AnchorPane(button, closeSon);
        anchorPane.setPrefWidth(400);
        anchorPane.setPrefHeight(300);
        setScene(new Scene(anchorPane));
        show();
    }
}

import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;

import java.util.Date;

/**
 * @author lingkang
 */
public class MySonA extends MyStageCommon {
    public Button button;

    public MySonA() {
        setTitle("子窗口A");
        MyParent parent = getStage(MyParent.class);
        Label label = new Label("我是儿子A");
        button = new Button("关闭父窗口");
        button.setOnAction(event -> {
            System.out.println(parent.getTitle());
            parent.close();
        });
        button.setLayoutY(40);

        Button open = new Button("打开父窗口");
        open.setLayoutY(80);
        open.setOnAction(event -> {
            if (parent.button != null)
                parent.button.setText("子调用父的对象" + new Date());// 父子传参
            parent.show();
        });

        Button exit = new Button("exit");
        exit.setLayoutY(120);
        exit.setOnAction(event -> {
            System.exit(0);
        });

        AnchorPane pane = new AnchorPane(label, button, open, exit);
        pane.setPrefWidth(300);
        pane.setPrefHeight(200);
        setScene(new Scene(pane));
    }
}

效果:
在这里插入图片描述

标签:javafx,JavaFx,Button,二十一,public,import,new,交互,button
来源: https://blog.csdn.net/weixin_44480167/article/details/121404928

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有