如果场景中存在 SwingNode,JavaFX ComboBox 不可单击

问题描述 投票:0回答:1

我正在尝试扩展现有的 JavaFX GUI,其中包括一个 ComboBox,并在单独的面板中使用自定义 Swing 组件(本例中只是一个空的 JPanel)。问题是,一旦我将 SwingNode 的组件设置到此面板,ComboBox 就变得不可单击。

我已将其分解为下面的最少代码。我们的应用程序是一个 Swing 应用程序,但某些表单主要使用 JavaFX 来存储其内容,这就是为什么它具有这种奇怪的 Swing-in-FX-in-Swing 结构。但这并不是真正可以避免的事情,而且通常不会造成任何问题。

避免使用外部 Swing 窗口并使用该场景创建 FX 舞台可以直接解决问题,但从架构上来说,这对于我们的应用程序来说不是一个选项。

我尝试使用最新的 JDK 21 和 OpenJFX 21 测试此代码,但它仍然没有修复。有没有人遇到过类似的问题并有建议的解决方法?谢谢!

import java.awt.BorderLayout;

import javax.swing.*;

import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.embed.swing.JFXPanel;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.VBox;

public class BugFrame extends JFrame {
    public static void main(String[] args) {
        BugFrame dlg = new BugFrame();
        dlg.setVisible(true);
    }

    private BugFrame() {
        super();

        JFXPanel jfxPanel = new JFXPanel();
        Platform.runLater(() -> jfxPanel.setScene(createScene()));
        add(jfxPanel, BorderLayout.CENTER);
    }

    private static Scene createScene() {
        ComboBox<String> combo = new ComboBox<>(FXCollections.observableArrayList(
                "Item 1", "Item 2"
        ));
        combo.setValue("Item 1");

        SwingNode swingNode = new SwingNode();
        swingNode.setContent(new JPanel());  // problem disappears when this line is deleted

        return new Scene(new VBox(combo, swingNode));
    }
}
java javafx openjfx jfxpanel
1个回答
0
投票

将此视为您问题的支持信息:

我不会说它是“不可点击的”..而是会说“弹出窗口没有显示”。因为它正在触发所有相关事件(鼠标单击、显示..等)以显示弹出窗口。

事实上,弹出窗口甚至是用项目渲染的。但不知怎的,它在屏幕上不可见(我不知道为什么)。

为了支持我的理由,请查看下面的 gif。

  • 当我尝试单击组合框时,未显示弹出窗口。
  • 当我触发自定义工具来检查节点(ScenicView 样式)时,就会显示弹出窗口。
  • 如果我关闭检查功能,则再次不会显示弹出窗口。

我怀疑有 applyCss 或某种相关类型的东西。如果您问为什么它与我的工具结合使用时可以工作..我不知道:)

我的工具代码中发生了很多事情..而且我不知道哪一个正在修复这个问题;)。只是给你这个信息..也许它可以帮助你解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.