2

我正在尝试在基于摇摆的 UI 上创建一个透明的 JFXPanel。问题是事件没有像正常挥杆组件那样通过“透明”部分转发。我在下面包含了一个简单的示例。注意有3层,swing,swing,然后是jfxpanel。如果你注释掉

addItemToLayeredPanel(panel, createFXOverlay(), 7);

即使它们的 jpanel 位于底部的上方,您也可以单击这两个按钮。(仅演示效果仅适用于摇摆不适用于 JFXPanel)

public class Main {
public static void main(String[] args) {
    JFrame frame = new JFrame();
    JLayeredPane panel = new JLayeredPane();
    JButton button = new JButton("Push me");
    JPanel overlay = createOverlay();

    addItemToLayeredPanel(panel, button, 5);
    addItemToLayeredPanel(panel, overlay, 6);
    addItemToLayeredPanel(panel, createFXOverlay(), 7);

    frame.getContentPane().add(panel);
    frame.setSize(500, 500);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

private static JPanel createOverlay() {
    JPanel panel = new JPanel();
    panel.add(new JButton("on top"));
    panel.setOpaque(false);
    return panel;
}

private static JFXPanel createFXOverlay() {
    JFXPanel panel = new JFXPanel();
    BorderPane root = new BorderPane();
    root.setStyle("-fx-background-color:transparent;");
    root.setCenter(new Button("root"));
    Scene scene = new Scene(root);

    scene.setFill(javafx.scene.paint.Color.TRANSPARENT);
    panel.setScene(scene);
    panel.setOpaque(false);
    return panel;
}

private static void addItemToLayeredPanel(JLayeredPane panel, JComponent item, int layer) {
    item.setBounds(0,0,500,500);
    panel.add(item);
    panel.setLayer(item, layer);
}

}

想法?我尝试了几种将事件(通常)转发到下面的 jcomponents 的方法,但我无法让它工作。我确实找到了几个类似的问题,但在这里这里没有解决方案

4

1 回答 1

0

当 Swings 尝试查看鼠标事件是否通过时,它使用该JComponent方法

public boolean contains(int x, int y) {
    return (ui != null) ? ui.contains(this, x, y) : super.contains(x, y);
}

问题在于JFXPanel,与其他 Swing 组件不同,它没有定义ui ComponentUI. 因此,检查回退到super.contains(x,y),如果鼠标事件发生在对象的范围内,则返回 true。

解决方案是使用扩展 JFXPanel 并覆盖该contains方法的类:

public class MyJFXPanel extends JFXPanel{
    @Override
    public boolean contains(int x, int y) { return false; }
}

wherefalse可以用更复杂的语句代替,例如像素透明度条件。

然后鼠标事件将自动转发到 MyJFXPanel 下方的元素。

于 2020-04-03T09:24:26.707 回答