JavaFx 打开一个新窗口和窗口交互(四)

JavaFX 从入门入门到入土系列
前面我演示的demo都是单个窗口,那么如何实现多个窗口呢?使用Stage secondStage = new Stage();然后secondStage.show();展示即可。

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.stage.Stage; /**
* @author lingkang
* @date 2021/9/17 22:29
* @description
*/
public class WindowsDemo extends Application {
public void start(Stage stage) throws Exception {
stage.setTitle("标题");
stage.getIcons().add(new Image("img/avatar.jpg"));
stage.setHeight(200);
stage.setWidth(300); Button button = new Button("打开窗口");
// 添加一个点击事件
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
// 创建新的stage
Stage newStage = new Stage();
newStage.setWidth(300);
newStage.setHeight(200);
Label label = new Label("新窗口");
newStage.setScene(new Scene(label));
// 显示
newStage.show();
}
});
// 直接添加样式
button.setStyle("-fx-background-color: red;-fx-text-fill: blue;");
stage.setScene(new Scene(button));
stage.show();
} public static void main(String[] args) {
launch(args);
}
}

效果如下

那么他们怎么交互呢?

简单关闭第一个窗口可以在显示第二个窗口时调用 stage.close();关闭第一个窗口第一个窗口

Button button = new Button("打开窗口");
// 添加一个点击事件
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
// 创建新的stage
Stage newStage = new Stage();
newStage.setWidth(300);
newStage.setHeight(200);
Label label = new Label("新窗口");
newStage.setScene(new Scene(label));
// 显示
newStage.show();
// 关闭第一个窗口
stage.close();
}
});

窗口间交互

窗口间交互通过公共静态map进行,后面的文章我会用RxJava异步事件实现。

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.layout.VBox;
import javafx.stage.Stage; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; /**
* @author lingkang
* @date 2021/9/17 22:29
* @description
*/
public class WindowsDemo extends Application { public static ConcurrentMap<String, Stage> stageManage = new ConcurrentHashMap<>(); public void start(Stage stage) throws Exception {
stage.setTitle("标题");
stage.getIcons().add(new Image("img/avatar.jpg"));
stage.setHeight(200);
stage.setWidth(300); Button button = new Button("打开窗口");
// 添加一个点击事件
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
// 创建新的stage
Stage newStage = new Stage();
newStage.setWidth(300);
newStage.setHeight(200);
Label label = new Label("新窗口");
newStage.setScene(new Scene(label));
// 显示
newStage.show();
// 关闭第一个窗口
//stage.close(); // 放到静态map中共用,从而达到状态管理
stageManage.put("second", newStage);
}
}); Button closeNewStage = new Button("关闭第二个窗口");
closeNewStage.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
// 通过共用的map,关闭第二个窗口
stageManage.get("second").close();
}
}); // 直接添加样式
button.setStyle("-fx-background-color: red;-fx-text-fill: blue;");
VBox vBox = new VBox();
vBox.getChildren().add(button);
vBox.getChildren().add(closeNewStage);
stage.setScene(new Scene(vBox));
stage.show();
// 放到静态map中共用,从而达到状态管理
stageManage.put("first", stage);
} public static void main(String[] args) {
launch(args);
}
}

效果

JavaFx 打开一个新窗口和窗口交互(四)的更多相关文章

  1. windbg学习---.browse打开一个新的command 窗口

    .browse r eax .browse <command>将会显示新的命令浏览窗口和运行给出的命令

  2. Window.open 实现导航与打开窗口,导航到一个特定链接地址,也可以打开一个新的浏览器窗体

    语法 window.open(strUrl,strWindowName,strWindowFeatures ,replace) strUrl: 打开资源的地址 strWindowName: 表示窗体名 ...

  3. JS 点击元素发ajax请求 打开一个新窗口

    JS 点击元素发ajax请求 打开一个新窗口 经常在项目中会碰到这样的需求,点击某个元素后,需要发ajax请求,请求成功以后,开发需要把链接传给前端(或者说请求成功后打开新窗口),前端需要通过新窗口打 ...

  4. vue中使用router打开一个新的窗口

    一个单页应用打开一个新的窗口不是很好控制,比如权限的处理,因为原先的页面不会自动刷新,方法很简单: let routeData = this.$router.resolve({ name: " ...

  5. 使用javascript打开一个新页而不被浏览器屏蔽

    使用javascript打开一个新页面可以有几种方式,但各有利弊,以下做下分析 1.window.open(url) 这是新手最常用的方法,好处是简单易用,坏处,很简单,会被很多浏览器拦截而导致功能失 ...

  6. 在做爬虫或者自动化测试时新打开一个新标签页,必须使用windows切换

    在做爬虫或者自动化测试时,有时会打开一个新的标签页或者新的窗口,直接使用xpath定位元素会发现找不到元素,在firefox中定位了元素还是找不到, 经过多次发现,在眼睛视野内看到这个窗口是在最前面, ...

  7. Virtualbox中不能为虚拟机打开一个新任务的原因及解决方法

    VirtualBox新建虚拟机时报错,不能为虚拟机打开一个新任务的原因 解决办法如下 1.保证bios里的virtualization technology的选项开启,不同电脑BIOS设置可能会不一样 ...

  8. Android课程---Oracle VM VirtualBox出现不能为虚拟机打开一个新任务

    因工作需要在Win7下增添了Win7虚拟系统,随着VirtualBox 4.326的版本更新,用户们也开始升级.一用户在升级后发现原来创建的虚拟机无法打开,提示信息为:不能为虚拟电脑win7打开一个新 ...

  9. VirtualBox不能为虚拟电脑 Ubuntu 打开一个新任务

    今天在用Vbox中的Ubuntu系统准备测试Python代码时,Vbox报了一个错误:"不能为虚拟电脑 Ubuntu 打开一个新任务".因为之前用的时候还好好的,也不知道是不是最近 ...

  10. 不能为虚拟电脑 ubuntu 打开一个新任务.

    使用virtualbox报错: 不能为虚拟电脑 ubuntu3 打开一个新任务. The virtual machine 'ubuntu3' has terminated unexpectedly d ...

随机推荐

  1. 2023 ICPC 网络赛 I

    没留够时间准备导致开考的时候耽搁了 开场我先写缺省源,抄串了一行,后面才发现...然后看了 L 发现是签到,此时 ddw 会了 A 让 zsy 上去写,我等了一会才把 zsy 撵下来写 L 是个失误 ...

  2. Llama2-Chinese项目:4-量化模型

    一.量化模型调用方式   下面是一个调用FlagAlpha/Llama2-Chinese-13b-Chat[1]的4bit压缩版本FlagAlpha/Llama2-Chinese-13b-Chat-4 ...

  3. studio

  4. Linux: Authentication token is no longer valid

    遇见问题: [oracle@sxty-jkdb-184:/u01/rman]crontab -l Authentication token is no longer valid; new one re ...

  5. 几个易错的python小知识点

    大家好,我是暴走の海鸽~ 本期整理了几个基础python防坑小常识,希望对大家有所帮助. 1. type == object? 执行以下代码的结果是什么: >>> isinstanc ...

  6. 2020/4/29 一场令人头疼的cf。。。

    今天是被安排的cf...我真的是太菜了啊...又双叒叕被机房的一群dalao吊打了... 这就是我与6年级的dalao的区别吗...我裂开了 T1:A - Exercising Walk 简单题. 就 ...

  7. Python 中多态性的示例和类的继承多态性

    单词 "多态" 意味着 "多种形式",在编程中,它指的是具有相同名称的方法/函数/操作符,可以在许多不同的对象或类上执行. 函数多态性 一个示例是 Python ...

  8. dijkstra算法(朴素 + 堆优化)

    dijkstra算法的大题思路是通过n - 1次迭代,每次迭代把一个点距汇点的最短路确定,当n - 1次循环过后所有点的最短路都已经确定 注意:dijkstra算法只适用于没有负权边的单源最短路 以下 ...

  9. 数据结构与算法(LeetCode) 第二节 链表结构、栈、队列、递归行为、哈希表和有序表

    一.链表结构 1.单向链表节点结构 public class Node{ public int value; public Node next; public Node(int data){ valu ...

  10. 把工单历史表中的数据,按照工单进行分类,每一批工单的数据放在同一个 key 中

    /** * 把工单历史表中的数据,按照工单进行分类,每一批工单的数据放在同一个key中 * 将对象列表按名称分类成 Map(分类名必与对象的某 get 方法的后的名一致<如:get(name) ...