Swing和JavaFX:使用JFXPanel

我很快将不得不在基于Swing的胖客户端中处理JavaFX –哦,对不起,我的意思是“多层富客户端”!

因此,这使我来看看JFXPanelJFXPanel是一个javax.swing.JComponent,用于将JavaFX内容嵌入到Swing-UI中。 JFXPanel的用法类似于JPanel,并且可以通过EDT作为通用Swing组件进行访问,除了必须通过JavaFX应用程序线程来处理JavaFX组件

为了解决这些问题,我创建了两个类似的面板(Swing + JavaFX),每个面板都有一个按钮,一个TextField和一个Label,并将它们放置在JSplitPane和JFrame中:

仔细看里面

要尝试Swing <-> JavaFX互操作性,按钮操作是将文本从TextField设置为JLabel,反之亦然。
JPanel处理通用的Swing东西没有什么特别的,但是JFXPanel包含JavaFX控件:

public class SwingFXPanel extends JFXPanel {private Button testButton;private TextField testTextField;private Label testLabel;private VBox pane;public SwingFXPanel() {init();}private void init() {testButton = new Button("I am a JavaFX Button");testTextField = new TextField();testLabel = new Label("empty");pane = new VBox();pane.setAlignment(Pos.CENTER);pane.getChildren().addAll(testTextField, testButton, testLabel);Platform.runLater(this::createScene);}private void createScene() {Scene scene = new Scene(pane);setScene(scene);}public Button getTestButton() {return testButton;}public TextField getTestTextField() {return testTextField;}public Label getTestLabel() {return testLabel;}
}

这里很重要:将场景添加到JavaFX Application线程内的JFXPanel:

Platform.runLater(this::createScene);

如果您致电:

createScene()

从另一个线程,您会获得Runtime-Exception:

java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0

同样,每次与JavaFX相关内容的交互都必须放在JavaFX Application Thread上:

例如:

Platform.runLater(() -> {swingFXPanel.getTestLabel().setText(swingPanel.getTestTextField().getText());
});
public class InteropFrame extends JFrame {private JSplitPane centralSplitPane;private SwingPanel swingPanel;private SwingFXPanel swingFXPanel;public InteropFrame(){init();}private void init() {setTitle("Swing <-> JavaFX Interoperatbiliy");setSize(500, 500);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(new BorderLayout());centralSplitPane = new JSplitPane();centralSplitPane.setDividerLocation(0.5);centralSplitPane.setResizeWeight(0.3);swingPanel = new SwingPanel();swingFXPanel = new SwingFXPanel();swingPanel.getTestButton().addActionListener((ActionEvent e) -> {Platform.runLater(() -> {swingFXPanel.getTestLabel().setText(swingPanel.getTestTextField().getText());});});swingFXPanel.getTestButton().setOnAction((javafx.event.ActionEvent t) -> {swingPanel.getTestLabel().setText(swingFXPanel.getTestTextField().getText());});centralSplitPane.setLeftComponent(swingPanel);centralSplitPane.setRightComponent(swingFXPanel);add(centralSplitPane, BorderLayout.CENTER);}
}

另外,处理FXML也很简单:

public class SwingFXMLPanel extends JFXPanel {@FXMLprivate Button testButton;@FXMLprivate TextField testTextField;@FXMLprivate Label testLabel;private VBox rootPane;private URL fxmlResource;public SwingFXMLPanel(URL fxmlResource){this.fxmlResource = fxmlResource;init();}private void init(){rootPane = new VBox();FXMLLoader loader = new FXMLLoader(fxmlResource);loader.setController(this);loader.setRoot(rootPane);try {loader.load();} catch (IOException ex) {Logger.getLogger(SwingFXMLPanel.class.getName()).log(Level.SEVERE, null, ex);}testButton.setText("I am a JavaFX Button");testLabel.setText("empty");Platform.runLater(this::createScene);}private void createScene() {Scene scene = new Scene(rootPane);setScene(scene);}public Button getTestButton() {return testButton;}public TextField getTestTextField() {return testTextField;}public Label getTestLabel() {return testLabel;}}

对我来说,让我的同事尽可能多地接受在Swing中使用JavaFX至关重要。

因此,我想简化特定的FX应用程序线程处理。 因此,如果使用JPanel的主要区别只是添加以下内容,那么也许可以实现:

private void createScene() {Scene scene = new Scene(rootPane);setScene(scene);}

并致电:

Platform.runLater(this::createScene);

JFXPanel中

  • 您可以在此处找到完整的示例代码。

翻译自: https://www.javacodegeeks.com/2014/11/swing-and-javafx-working-with-jfxpanel.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于nodejs中npm命令没有反应的解决方法

最近在学习angularJS&#xff0c;正在做一个单页面应用&#xff0c;在安装nodejs之后&#xff0c;发现命令行传了输入npm -v能输出结果外&#xff0c;其余npm的任何操作都没有反应&#xff0c;一开始我以为是下载的比较慢&#xff0c;等了半小时还是没动静&#xff0c;只有下标…

Red Hat Enterprise 5 server 上安装 memcached 的问题记录

国内私募机构九鼎控股打造APP&#xff0c;来就送 20元现金领取地址&#xff1a;http://jdb.jiudingcapital.com/phone.html内部邀请码&#xff1a;C8E245J &#xff08;不写邀请码&#xff0c;没有现金送&#xff09;国内私募机构九鼎控股打造&#xff0c;九鼎投资是在全国股份…

统计一个panel中lable的个数

int n panel.Controls.OfType<Label>().Count();转载于:https://www.cnblogs.com/linji/archive/2012/09/20/2694640.html

Java扩展机制可加载所有JAR

Java扩展机制在Java教程中被描述为“一种标准的&#xff0c;可伸缩的方式&#xff0c;以使自定义API可供Java平台上运行的所有应用程序使用。” 如了解扩展类加载中所述 &#xff0c;“扩展框架利用类加载委托机制”&#xff0c;其中扩展类在rt.jar &#xff08;和相关的JAR&am…

js中的 return false;

总的来说return false 的作用就是阻止事件的默认行为 1、 function check() { if(form.title.value"") { alert("请输入文章标题!"); return false; //注意不能写成 return(false); } if(form.content.value"") { alert("文章正文不能为空…

C++的文艺复兴: Why C++? 王者归来

因为又有人叫我去Quora的C2C站去回答问题了&#xff0c;这回是 关于 《2012 不宜进入的三个技术点ActionScript&#xff0c;Thread 和 C&#xff0c; C争议的争议最大。(要我说&#xff0c;.NET比C更需要慎重进入&#xff0c;呵)。我就在这里回复一下这个问题吧。 正好我前段时…

PAT_B_1012 数字分类 (有待改进)

题目描述&#xff1a; 给定一系列正整数&#xff0c;请按要求对数字进行分类&#xff0c;并输出以下 5 个数字&#xff1a; A​1​​ 能被 5 整除的数字中所有偶数的和&#xff1b; A​2​​ 将被 5 除后余 1 的数字按给出顺序进行交错求和&#xff0c;即计算 n​1​​ −n…

Drools和jBPM KIE A​​pps平台

随着Drools和jBPM&#xff08;KIE&#xff09;6系列出现了一个新的工作台&#xff0c;并有望最终实现用户的可扩展性。 我终于有了一些预告片&#xff0c;以显示此工作原理以及所存储的内容。 确保选择1080p并全屏显示&#xff0c;以达到最佳效果。 &#xff08;点击放大&…

js 严格模式

一、概述 除了正常运行模式&#xff0c;ECMAscript 5添加了第二种运行模式&#xff1a;"严格模式"&#xff08;strict mode&#xff09;。顾名思义&#xff0c;这种模式使得Javascript在更严格的条件下运行。 设立"严格模式"的目的&#xff0c;主要有以下…

软件工程之系统建模

1、系统工程&#xff1a; 软件工程由系统工程演变而来&#xff0c;要了解软件工程应先了解系统工程。系统工程一般通过自顶向下、自底向上的方法&#xff0c;用层次结构来来分析整个系统。在系统工程层次图中自顶向下依次是全局视图&#xff08;业务或产品域&#xff09;——领…

采访田飞师兄有感 ——by 李皈颖

来MSRA后一个月了&#xff0c;终于迎来了现代软件工程&#xff0c;开课第一天&#xff0c;殷老师&#xff08;也是我的“馒头”&#xff09;要求我们去采访一下前任师兄&#xff0c;了解一下他们的感受。我们组联合采访了陈凯师兄&#xff0c;但是因为我忘记了&#xff0c;所以…

不要在facelets中重复表情

您是否曾经在JSF中看到过像这样的重复EL表达式&#xff1f; <h:inputText value"#{oneBean.name}" rendered"#{anotherBean.showPerson}"/> <h:inputText value"#{oneBean.birthday}" rendered"#{anotherBean.showPerson}"/…

模态对话框和全选反选

一、目标 制作一个表格&#xff0c;第一行分别为选择、主机名和端口增加一个按钮&#xff0c;名称为添加点击添加按钮&#xff0c;出现一个半透明的遮罩层&#xff0c;遮罩层中间有个弹出框弹出框中有两个输入框&#xff0c;分别为主机名和端口&#xff0c;还有两个按钮&#…

(转)iReaper for wp7正式发布

原文地址&#xff1a;http://www.cnblogs.com/AlexCheng/archive/2012/02/06/2339968.htmliReaper for windows phone 7今天正式发布了。有windows phone 7手机的朋友可以通过手机在线收听收看webcast中文课程。只要你有网络任何时间任何地点都可以学习微软技术&#xff0c;为您…

Neo4j:Cypher –避免热切

当心渴望的管道 尽管我喜欢Cypher的LOAD CSV命令使它容易地将数据获取到Neo4j中的方法&#xff0c;但它目前打破了最不惊奇的规则&#xff0c;因为它急切地在所有行中加载某些查询&#xff0c;即使是那些使用定期提交的查询。 这是我的同事Michael在第二篇博客文章中指出的&a…

一步步构建大型网站架构 [转]

来源: itivy 原文链接 之前我简单向大家介绍了各个知名大型网站的架构&#xff0c;MySpace的五个里程碑、Flickr的架构、YouTube的架构、PlentyOfFish的架构、WikiPedia的架构。这几个都很典型&#xff0c;我们可以从中获取很多有关网站架构方面的知识&#xff0c;看了之后你…

img、列表和table标签

一、img图片 <body><a href"https://www.fmtxt.com"><img src"images/1.jpg" title"哆啦A梦" style"height: 200px; width: 200px " alt"哆啦A梦"/></a></body>1. 放在 a 标签中&#xff0c…

使用Arquillian测试安全的EJB

从历史上讲&#xff0c;很难对安全的EJB进行测试。 到目前为止&#xff0c;我一直在使用诸如用Arquillian 在WildFly 8.1.x上测试安全的EJB文章中描述的JBossLoginContextFactory等专有技术来测试安全的EJB。 在本年度Devoxx中 &#xff0c; Apache TomEE项目&#xff08;轻量…

Java基础笔记之数据类型

一、数据类型 &#xff08;一&#xff09;8种基本数据类型(内置数据类型\C#中为值类型) 字符长度&#xff1a;1byte 8 bit;布尔&#xff1a;可认为是 1byte (8 bit);字符&#xff1a;char&#xff1a;2/16整型:short: 2/16int: 4/32long: 16/64浮点型:float: 8/32double: 16/6…

SSTI模板注入基础(Flask+Jinja2)

文章目录 一、前置知识1.1 模板引擎1.2 渲染 二、SSTI模板注入2.1 原理2.2 沙箱逃逸沙箱逃逸payload讲解其他重要payload 2.3 过滤绕过点.被过滤下划线_被过滤单双引号 "被过滤中括号[]被过滤关键字被过滤 三、PasecaCTF-2019-Web-Flask SSTI参考文献 一、前置知识 1.1 模…