Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX2.2:如何将鼠标事件转发到JLayeredPane中JFXPanel下的Swing组件?_Java_Swing_Javafx 2 - Fatal编程技术网

JavaFX2.2:如何将鼠标事件转发到JLayeredPane中JFXPanel下的Swing组件?

JavaFX2.2:如何将鼠标事件转发到JLayeredPane中JFXPanel下的Swing组件?,java,swing,javafx-2,Java,Swing,Javafx 2,在我的应用程序中,我希望有一个带有JavaFX控制的Swing面板。为此,我使用了一个JLayeredPane,在其中插入一个JPanel和一个JFXPanel,其中的场景没有填充(akasetFill(null))。但没有任何事件通过JFXPanel的透明区域传递到Swing面板 这个问题有什么解决办法吗 谢谢 这里有一个例子: public class TestJavaFX { private static JButton button; pr

在我的应用程序中,我希望有一个带有JavaFX控制的Swing面板。为此,我使用了一个JLayeredPane,在其中插入一个JPanel和一个JFXPanel,其中的场景没有填充(aka
setFill(null)
)。但没有任何事件通过JFXPanel的透明区域传递到Swing面板

这个问题有什么解决办法吗

谢谢

这里有一个例子:

    public class TestJavaFX
    {
        private static JButton button;
        private static JFXPanel javafxPanel;

        public static void main(String[] args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    initAndShowGUI();
                }
            });
        }

        public static void initAndShowGUI()
        {
            JFrame frame = new JFrame("Swing application");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            javafxPanel = new JFXPanel();
            button = new JButton("Swing - Push me");

            JLayeredPane pane = new JLayeredPane();
            pane.add(button, JLayeredPane.DEFAULT_LAYER);
            pane.add(javafxPanel, JLayeredPane.PALETTE_LAYER);
            pane.addComponentListener(new ComponentListener()
            {
                @Override
                public void componentShown(ComponentEvent e)
                {
                }

                @Override
                public void componentResized(ComponentEvent e)
                {
                    button.setBounds(20, 50, 150, 30);
                    javafxPanel.setBounds(0, 0, e.getComponent().getWidth(), e.getComponent().getHeight());
                }

                @Override
                public void componentMoved(ComponentEvent e)
                {
                }

                @Override
                public void componentHidden(ComponentEvent e)
                {
                }
            });

            frame.getContentPane().add(pane, BorderLayout.CENTER);

            Platform.runLater(new Runnable()
            {
                public void run()
                {
                    createScene();
                }
            });

            // Show frame.
            frame.setSize(600, 400);
            frame.setVisible(true);
        }

        private static void createScene()
        {
             Button btn = new Button();
             btn.setText("JavaFX - Push me");

             VBox pane = new VBox();
             pane.getChildren().add(btn);
             Scene scene = new Scene(pane);
             scene.setFill(null);
             javafxPanel.setScene(scene);
        }
   }

我认为您的问题是需要将Componenet侦听器设置为javafxPanel.addComponentListener,而不是pane.addComponentListener。试试看,告诉我发生了什么。谢谢,但我的问题不是组件的大小问题,而是不接收像鼠标事件这样的事件。我通过在JavaFX场景中添加一个事件监听器并将其发送到底层Swing组件找到了一个解决方案。但是,我希望有一个更干净的解决方案。我担心手动转换事件实际上是一种方法。我不知道还有什么更通用的事件转发机制。我是通过在互联网上搜索得出这个结论的,但我想得到确认!无论如何,谢谢。@pascal请发布您的答案并将其设置为解决方案