Java:与另一个(JVM)进程的JFrame交互

Java:与另一个(JVM)进程的JFrame交互,java,swing,automation,jvm,Java,Swing,Automation,Jvm,假设我们有一个Java Swing应用程序,swingapp,在一个JVM中运行。是否可以从另一个JVM/进程中运行的Java应用程序控制swingapp,例如: ControlApp.java 用例是GUI测试,我希望有一个通用的解决方案,可以在外部进程中启动/停止任何Swing应用程序,以将其与测试运行程序完全隔离,但它仍然能够通过Swing操作控制应用程序 如果可能的话,我们将非常感谢具体的例子。我认为有一些依赖于平台的方法可以将UI事件发送到同一桌面上的GUI元素;但是,我最好考虑一些标

假设我们有一个Java Swing应用程序,swingapp,在一个JVM中运行。是否可以从另一个JVM/进程中运行的Java应用程序控制swingapp,例如:

ControlApp.java

用例是GUI测试,我希望有一个通用的解决方案,可以在外部进程中启动/停止任何Swing应用程序,以将其与测试运行程序完全隔离,但它仍然能够通过Swing操作控制应用程序


如果可能的话,我们将非常感谢具体的例子。

我认为有一些依赖于平台的方法可以将UI事件发送到同一桌面上的GUI元素;但是,我最好考虑一些标准的进程间通信

您可以尝试在某个端口范围内启动应用程序,让它们搜索每个同级,并通过套接字在它们之间进行通信。或者,您可以启动一种父守护进程,在该进程中,每个子进程都注册自己(再次通过套接字),然后父进程将状态更改传递给其子进程(类似于主题观察者模式的分布式版本)

为此,可以使用“更高”级别的套接字

下面是一些示例和实现:

您可以从服务器开始实现jframe.hide API调用

注意:如果您不喜欢本机C传输实现,那么您可以切换到
无需对代码进行额外更改。

socket的级别有点低,我可能会考虑使用JMS。如果您认为您的环境需要异步通信,那么它是正确的选择。但是,请注意,它需要一个繁重的基础设施来运行——也许JBoss服务器是我所知道的最轻的,以便让JMS工作。我相信,您也可以应用HornetQ standalone,您不需要一个成熟的JEE服务器。
process = startSwingAppInAnotherProcess();
JFrame frame = getSwingAppJFrame();
frame.visible(false) // hide swingapps JFrame
doAllKindsOfThingsWithJFrame(frame)..
killSwingApp(process);