簡體   English   中英

如何獲取 JavaFX Stage 的 AWT 窗口?

[英]How to get AWT Window for JavaFX Stage?

Java Taskbar 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 上,這是正確顯示任務欄進度狀態:
一個怪物


限制

我不能說我推薦這個,但無論如何,這是可能的。 但是,可能存在一些限制:

  • 這會初始化幾乎每個 Java UI 框架的子系統,這可能會產生大量的處理和內存開銷。 由於這個原因,通常不建議混合使用各種 Java UI 框架。
  • 使用 Java Swing 來呈現您的 JavaFX 應用程序可能在性能方面存在嚴重缺陷,甚至與應用程序的其余部分的兼容性也存在缺陷。

與 Swing 不同,JavaFX 不使用 AWT 創建窗口。


您可以將 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM