JavaFx之场景交互(二十一)
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 {
private String thisClassName=getClass().getName();//将当前类名单独初始化
public MyStageCommon() {
super();
// 创建窗口时加入
MyApp.stages.put(thisClassName, this);
// x 掉窗口时将它移除
setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
MyApp.stages.remove(thisClassName);
}
});
}
@Override
public void close() {
super.close();
MyApp.stages.remove(thisClassName);
}
/**
* 获取对象,,注意返回空值
*/
public <T> T getStage(Class<T> clazz) {
if (!MyApp.stages.containsKey(clazz.getName()))
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之场景交互(二十一)的更多相关文章
- WCF技术剖析之二十一:WCF基本异常处理模式[中篇]
原文:WCF技术剖析之二十一:WCF基本异常处理模式[中篇] 通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultExcept ...
- 中介者模式 调停者 Mediator 行为型 设计模式(二十一)
中介者模式(Mediator) 调度.调停 意图 用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散 而且可以独立地改变它们之间的交互. ...
- WCF技术剖析之二十一:WCF基本异常处理模式[下篇]
原文:WCF技术剖析之二十一:WCF基本异常处理模式[下篇] 从FaultContractAttribute的定义我们可以看出,该特性可以在同一个目标对象上面多次应用(AllowMultiple = ...
- WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]
原文:WCF技术剖析之二十一: WCF基本的异常处理模式[上篇] 由于WCF采用.NET托管语言(C#和NET)作为其主要的编程语言,注定以了基于WCF的编程方式不可能很复杂.同时,WCF设计的一个目 ...
- iOS 11开发教程(二十一)iOS11应用视图美化按钮之实现按钮的响应(1)
iOS 11开发教程(二十一)iOS11应用视图美化按钮之实现按钮的响应(1) 按钮主要是实现用户交互的,即实现响应.按钮实现响应的方式可以根据添加按钮的不同分为两种:一种是编辑界面添加按钮实现的响应 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)
本文将介绍如何在 .NET Core 环境下,借助 SignalR 在小程序内使用 WebSocket.关于 WebSocket 和 SignalR 的基础理论知识不在这里展开,已经有足够的参考资料, ...
- 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用
目录 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用 21.1 read命令键盘读取变量的值 21.1.1 read常用见用法及参数 21.2 流程控制语句if 21.2 ...
- Django笔记二十一之使用原生SQL查询数据库
本文首发于公众号:Hunter后端 原文链接:Django笔记二十一之使用原生SQL查询数据库 Django 提供了两种方式来执行原生 SQL 代码. 一种是使用 raw() 函数,一种是 使用 co ...
- 无废话ExtJs 入门教程二十一[继承:Extend]
无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...
- Bootstrap <基础二十一>徽章(Badges)
Bootstrap 徽章(Badges).徽章与标签相似,主要的区别在于徽章的边角更加圆滑. 徽章(Badges)主要用于突出显示新的或未读的项.如需使用徽章,只需要把 <span class= ...
随机推荐
- Centos7安装yarn
Centos7安装yarn 设置Yarn仓库 curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc ...
- 文心一言 VS 讯飞星火 VS chatgpt (101)-- 算法导论9.3 7题
七.用go语言,设计一个 O(n)时间的算法,对于一个给定的包含n个互异元素的集合 S 和一个正整数k≤n,该算法能够确定 S 中最接近中位数的k个元素. 文心一言: 要设计一个 O(n) 时间的算法 ...
- OKR 是什么?
OKR OKR 是什么? OKR(Objectives and Key Results)目标与关键结果管理法,起源于英特尔,后在谷歌发扬光大. OKR 是一套协助组织进行目标管理的工具和方法,旨在促进 ...
- DHorse v1.4.2 发布,基于 k8s 的发布平台
版本说明 优化特性 在集群列表增加集群版本: 修改Jvm的GC指标名: 解决问题 解决shell脚本换行符的问题: 解决部署历史列表页,环境名展示错误的问题: 解决指标收集功能的异常: 升级指南 升级 ...
- ES6入门(一)
1.let声明的变量只在let命令所在的代码块内有效 2.不存在变量提升,先使用变量,后定义变量,就会报错. 3.let不允许在相同作用域内,重复声明同一个变量.
- ELK7.x环境部署
1.Elasticsearch (ES)配置: 部署配置ES,需要配置JDK环境,JDK是Java语言的软件开发工具包: 下载JAVA jdk源码包: wget https://mirrors.yan ...
- 使用Kali Linux进行主机发现实验
主机发现 [实训目的] 掌握主机扫描的工作原理,学会使用ping等扫描工具,发现网络当中活跃的主机. [场景描述] 在虚拟机环境下配置4个虚拟系统"Win XP1" "W ...
- 实战|如何低成本训练一个可以超越 70B Llama2 的模型 Zephyr-7B
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- 数字逻辑笔记 全加器全减器8421BCD转余3
二进制全加器 全减器 十进制加法 8421BCD转余3码
- Senparc 基础库全面适配 .NET 8.0
概要 Senparc 全家桶中的基础库已经全面适配 .NET 8.0,目前随着 .NET 8.0 的 RC 版本不断发布,对应的版本号也将同步进行更新,直到本月 Ignite 大会微软官方发布 .NE ...