如何为 JavaFX Stage 获取 AWT Window?
How to get AWT Window for JavaFX Stage?
Java 任务栏 API 包括一个用于设置 Window 进度状态的选项。
不幸的是,API 正在寻找 java.awt.Window。是否有首选 API 用于访问 java.awt.Window 以从 javafx.stage.Stage/Window?
传递给此方法
JavaFX 不使用 AWT 创建 window,与 Swing 不同。
您可以将 JavaFX Scene
嵌入到 Swing 应用程序中,如下所示:
// On EDT:
JFrame frame = new JFrame();
JFXPanel jfxPanel = new JFXPanel();
frame.setContentPane(jfxPanel);
// On JavaFX Application Thread:
jfxPanel.setScene(new Scene(...));
然后,JFrame
扩展了 java.awt.Frame
,这是一个 java.awt.Window
。
诚然,这是一个非常粗略的解决方案,但如果有帮助,我会把它留在这里。
将 Awt、Swing 和 JavaFX 链接成一个 Monstrosity
据我所知,这仅靠 JavaFX 是不可能的。但是,我们可以利用一些兼容性来实现您想要的。
- JavaFX 与 Java Swing 兼容:参见 documentation 示例。
- Java Swing 与 Awt 兼容:一些 Java Swing 类 extend
java.awt.Window
for compatibility purposes, which is accepted by the method you linked - setWindowProgressState(Window,Taskbar.State state)
. Instances of the following javax.swing
classes can be passed to the method you linked: javax.swing.JDialog
, javax.swing.JFrame
, javax.swing.JWindow
, javax.swing.Popup
通过链接与各种 Java UI 框架的互操作性,您可以设置 windows 任务栏状态。
这里有一个演示:
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javax.swing.*;
import java.awt.*;
public class Test {
public static void main(String[] args) {
// initialize a Swing application
JFrame frame = new JFrame("JavaFX with Swing abuse");
// create a Swing compatible JavaFX container
JFXPanel fxPanel = new JFXPanel();
// initialize JavaFX container
StackPane root = new StackPane();
Scene scene = new Scene(root, 600, 400, Color.ALICEBLUE);
// add elements
Button button = new Button();
button.setText("Say 'Hello World'");
button.setOnAction(event -> System.out.println("Hello World!"));
root.getChildren().add(button);
fxPanel.setScene(scene);
// configure Swing JFrame
frame.add(fxPanel);
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
// use Awt compatibility with Swing
Taskbar taskbar = Taskbar.getTaskbar();
taskbar.setWindowProgressState(frame, Taskbar.State.ERROR);
taskbar.setWindowProgressValue(frame, 50);
}
}
在 Windows 10 上,这是正确显示任务栏进度状态:
限制
我不能说我推荐这个,但无论如何,这是可能的。但是,可能存在一些限制:
- 这会初始化几乎每个 Java UI 框架的子系统,这可能会产生大量的处理和内存开销。由于这个原因,混合各种 Java UI 框架通常是 ill-advised。
- 使用 Java Swing 呈现您的 JavaFX 应用程序可能会在性能甚至与应用程序其余部分的兼容性方面存在严重缺陷。
Java 任务栏 API 包括一个用于设置 Window 进度状态的选项。
不幸的是,API 正在寻找 java.awt.Window。是否有首选 API 用于访问 java.awt.Window 以从 javafx.stage.Stage/Window?
传递给此方法JavaFX 不使用 AWT 创建 window,与 Swing 不同。
您可以将 JavaFX Scene
嵌入到 Swing 应用程序中,如下所示:
// On EDT:
JFrame frame = new JFrame();
JFXPanel jfxPanel = new JFXPanel();
frame.setContentPane(jfxPanel);
// On JavaFX Application Thread:
jfxPanel.setScene(new Scene(...));
然后,JFrame
扩展了 java.awt.Frame
,这是一个 java.awt.Window
。
诚然,这是一个非常粗略的解决方案,但如果有帮助,我会把它留在这里。
将 Awt、Swing 和 JavaFX 链接成一个 Monstrosity
据我所知,这仅靠 JavaFX 是不可能的。但是,我们可以利用一些兼容性来实现您想要的。
- JavaFX 与 Java Swing 兼容:参见 documentation 示例。
- Java Swing 与 Awt 兼容:一些 Java Swing 类 extend
java.awt.Window
for compatibility purposes, which is accepted by the method you linked -setWindowProgressState(Window,Taskbar.State state)
. Instances of the followingjavax.swing
classes can be passed to the method you linked:javax.swing.JDialog
,javax.swing.JFrame
,javax.swing.JWindow
,javax.swing.Popup
通过链接与各种 Java UI 框架的互操作性,您可以设置 windows 任务栏状态。
这里有一个演示:
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javax.swing.*;
import java.awt.*;
public class Test {
public static void main(String[] args) {
// initialize a Swing application
JFrame frame = new JFrame("JavaFX with Swing abuse");
// create a Swing compatible JavaFX container
JFXPanel fxPanel = new JFXPanel();
// initialize JavaFX container
StackPane root = new StackPane();
Scene scene = new Scene(root, 600, 400, Color.ALICEBLUE);
// add elements
Button button = new Button();
button.setText("Say 'Hello World'");
button.setOnAction(event -> System.out.println("Hello World!"));
root.getChildren().add(button);
fxPanel.setScene(scene);
// configure Swing JFrame
frame.add(fxPanel);
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
// use Awt compatibility with Swing
Taskbar taskbar = Taskbar.getTaskbar();
taskbar.setWindowProgressState(frame, Taskbar.State.ERROR);
taskbar.setWindowProgressValue(frame, 50);
}
}
在 Windows 10 上,这是正确显示任务栏进度状态:
限制
我不能说我推荐这个,但无论如何,这是可能的。但是,可能存在一些限制:
- 这会初始化几乎每个 Java UI 框架的子系统,这可能会产生大量的处理和内存开销。由于这个原因,混合各种 Java UI 框架通常是 ill-advised。
- 使用 Java Swing 呈现您的 JavaFX 应用程序可能会在性能甚至与应用程序其余部分的兼容性方面存在严重缺陷。