2

我有一个巨大的摇摆应用程序,我想将 javafx 嵌入其中。我尝试了很多次(通过遵循 oracle 教程等),只有当我声明一个新的 JFrame 以使用 JFXPanel 组件时我才成功。但是,我不想使用新的 Frame,我想将我的 Javafx 代码合并到 swing 应用程序的根 JFrame 中。

我们可以将 javaFX 组件嵌入 JPanel 而不是 JFrame 吗?如果答案是肯定的,为什么我没有成功?

有可能是错误的代码示例:

此类直接扩展 JPanel,并在 EDT 中调用 initialize 方法

private void initialize(){

  setLayout(new BorderLayout());

  final JFXPanel fxPanel = new JFXPanel();
  JPanel jp = new JPanel();

  jp.add(fxPanel);
  jp.setVisible(true);
  jp.setSize(500, 300);
  jp.setBackground(Color.CYAN);

  Platform.runLater(new Runnable() {
     @Override
     public void run() {
     initFX(fxPanel);
     }
  });

  add(createButtonsPanel(), BorderLayout.NORTH);
  add(jp,BorderLayout.CENTER);
}


private static void initFX(JFXPanel fxPanel) {
  Scene scene = initScene();
  fxPanel.setScene(scene);
}


private static Scene initScene(){

  Group  root  =  new  Group();
  Scene  scene  =  new  Scene(root, javafx.scene.paint.Color.ALICEBLUE );
  Text  text  =  new  Text();
  text.setX(40);
  text.setY(100);
  text.setFont(new Font(25));
  text.setText("Welcome JavaFX!");
  root.getChildren().add(text);
  return (scene);

}
4

2 回答 2

2

拿走了你的代码,把它变成了一个 SSCCE——一切似乎都正常,这表明问题出在你代码的其他地方。您可以使用此代码重现您的问题吗?

import java.awt.Color;
import java.awt.Container;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.*;
import javafx.scene.text.*;
import javax.swing.*;

public class SwingJFXCombo {

    public static Container initialize(){

        final JFXPanel fxPanel = new JFXPanel();
        JPanel jp = new JPanel();

        jp.add(fxPanel);
        jp.setVisible(true);
        // Really shouldn't do this, so commented it out
        //jp.setPreferredSize(new Dimension(500, 300));
        jp.setBackground(Color.CYAN);

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                initFX(fxPanel);
            }
        });

        return jp;
    }

    private static void initFX(JFXPanel fxPanel) {
        Scene scene = initScene();
        fxPanel.setScene(scene);
    }

    private static Scene initScene(){
        Group  root  =  new  Group();
        Scene  scene  =  new  Scene(root, javafx.scene.paint.Color.ALICEBLUE );
        Text  text  =  new  Text();
        text.setX(40);
        text.setY(100);
        text.setFont(new Font(25));
        text.setText("Welcome JavaFX!");
        root.getChildren().add(text);
        return (scene);
    }

    public static void main(String[] args){
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.add(SwingJFXCombo.initialize());
        frame.pack();
    }
}
于 2013-06-03T17:32:06.337 回答
1

最后,我找到了一种使 javafx 工作的方法。我让我的SwingJFXCombo类继承自一个抽象类,该类SimplePullerPanel提供处理拉动的方法(扩展了扩展 JPanelSimplePullerPanel的抽象类)。PullerPanel为了完成这项工作,我重写了buildContentPanel我们SwingJFXCombo类中的方法

public abstract class SimplePullerPanel extends PullerPanel implements PropertyChangeListener
{
     ...

    protected abstract JComponent buildContentPanel();

    @Override
    protected void buildPanel()
    {

        JComponent oContentPanel = buildContentPanel();
        JPanel panel = new JPanel();
        panel.add(oContentPanel);

        setLayout(new BorderLayout());
        add(panel, BorderLayout.CENTER);
    }

     ...
}

public class SwingJFXCombo extends SimplePullerPanel{

    final JFXPanel fxPanel = new JFXPanel();

    public SwingJFXCombo(){
        setName("fx sample"); 
    }

    private static void initFX(JFXPanel fxPanel) {
        Scene scene = createScene();
        fxPanel.setScene(scene);
    }

    private static Scene createScene(){
        Group  root  =  new  Group();
        Scene  scene  =  new  Scene(root, javafx.scene.paint.Color.ALICEBLUE );

        Text  text  =  new  Text();
        text.setX(40);
        text.setY(100);
        text.setFont(new Font(25));
        text.setText("Welcome JavaFX!");
        root.getChildren().add(text);
        return (scene);
    }

    @Override
    protected JComponent buildContentPanel()
    {
        JPanel frame = new JPanel();
        frame.add(fxPanel);
        frame.setSize(800, 600);
        Platform.runLater(new Runnable() {
            @Override
            public void run()
            {
                initFX(fxPanel);
            }
        });
        return frame;
    }
}

它没有解释为什么前面的代码不起作用,我注意到如果我想SimplePullerPanel通过删除一些我不使用的方法来创建我的自定义,我会面临同样的问题。很奇怪

于 2013-06-05T08:10:23.757 回答