java - 如何获取 JavaFX Stage 的 AWT 窗口?

标签 java javafx awt

Java 任务栏 API 包含一个用于设置窗口进度状态的选项。

https://docs.oracle.com/javase/10/docs/api/java/awt/Taskbar.html#setWindowProgressState(java.awt.Window,java.awt.Taskbar.State)

不幸的是,该 API 正在寻找 java.awt.Window。是否有用于访问 java.awt.Window 以从 javafx.stage.Stage/Window 传递给此方法的首选 API?

最佳答案

诚然,这是一个非常粗略的解决方案,但如果有帮助,我会把它留在这里。


将 Awt、Swing 和 JavaFX 链接成一个怪物

据我所知,这仅靠 JavaFX 是不可能的。但是,我们可以利用一些兼容性来实现您想要的。

通过链接与各种 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 上,这会正确显示任务栏进度状态:
a monstrosity


限制

我不能说我推荐这个,但无论如何,这是可能的。但是,可能存在一些限制:

  • 这会初始化几乎每个 Java UI 框架的子系统,这可能会产生大量的处理和内存开销。出于这个原因,混合使用各种 Java UI 框架通常是不明智的。
  • 使用 Java Swing 呈现 JavaFX 应用程序可能会在性能甚至与应用程序其余部分的兼容性方面存在严重缺陷。

关于java - 如何获取 JavaFX Stage 的 AWT 窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64616443/

相关文章:

java - 为什么 MouseEvent.getButton() 会返回 NO_BUTTON?

java - 在 JavaFX TextArea 中突出显示字符串

java - 当鼠标事件定位到具有鼠标监听器的 JComponent 时,如何将鼠标事件定位到更深的 JComponent

java - 从字符串方法获取 "null"[java]

java - 在 R 中使用 Stanford NLP 库,使用 rJava 包

java - 回调<P,R> 和函数<T,R> 之间的区别

Java无法打开IntelliJ构建的jar

java - 在 Java 中使用 CardLayout

java - Jframe setDefaultCloseOperation 不起作用

java - 即使使用 google play 核心库更新应用程序后,应用程序更新仍在继续