【问题标题】:Add a JPanel in a BorderPane在 BorderPane 中添加 JPanel
【发布时间】:2016-06-06 12:20:41
【问题描述】:

我有一个 Java 项目,它通过 JavaFX 媒体播放器 播放 .flv 媒体文件,并且运行良好。最近,我一直想通过在这个项目中添加 GUI 组件来进行实验(JPanel,JLabel)。但是,我的所有尝试都失败了,经过一些研究后发现它并不像我最初想象的那么简单。我尝试过 borderPane.setTop(JLabel) 但我得到了一个 “Cannot convert Jlabel to Node”错误..我觉得我错过了什么

如果有人知道为什么这对我不起作用,我将非常感谢任何形式的解释或示例.. :)

这里是代码,如果它可能对你有用!

@Override
public void start(Stage stage){
    String path = "Data/Video/Clip.flv";
    Media media = new Media(new File(path).toURI().toString());

    MediaPlayer mediaPlayer = new MediaPlayer(media);
    MediaView mediaView = new MediaView(mediaPlayer);

    BorderPane borderPane = new BorderPane();
    borderPane.setCenter(mediaView);

    //borderPane.add(logoPanel);                            <<<<<<< Error

    Scene scene = new Scene(borderPane, 1024, 800);
    scene.setFill(javafx.scene.paint.Color.BLACK);

    stage.setTitle("Media Player");
    stage.setScene(scene);
    stage.show();

    mediaPlayer.setAutoPlay(true);

【问题讨论】:

  • 您真的想将 Swing(JPanelJLabel 等)与 JavaFX(MediaPlayerBorderPane)混合使用吗?这样做很困难,并且需要使用两个不同的工具包和两个不同的 UI 线程。为什么不能只使用 JavaFX 构建 UI,是否有一个非常紧迫的原因?

标签: java swing javafx jlabel stage


【解决方案1】:

BorderPane 是一个 JavaFX 节点,而 JPanel 是一个 Java Swing 组件。

您不能将 JPanel 添加到 BorderPane,而是要寻找 JPanel 的 JavaFX 等效项,即 Pane 类。

如果您使用 JavaFX 进行开发,则仅使用 JavaFX 组件会更容易。如果您必须使用 Swing 组件,那么您可以使用 SwingNode 类。

【讨论】:

    【解决方案2】:

    您基本上想要实现的目标:将一些 Swing 组件添加到 JavaFX 应用程序。

    您必须使用SwingNode 类来“包装”JComponent

    SwingNode 类

    JavaFX 8 引入了 SwingNode 类,它位于 javafx.embed.swing 包。此类使您能够嵌入 Swing JavaFX 应用程序中的内容。要指定内容 SwingNode 对象,调用 setContent 方法,该方法接受一个 javax.swing.JComponent 类的实例。

    您可以查看this tutorial 如何将 Swing 组件嵌入到 JavaFX 应用程序中。

    将 Swing Button 放入 BorderPane 中心的小例子

    public class Main extends Application {
        @Override
        public void start(Stage primaryStage) {
            try {
                BorderPane root = new BorderPane();
                Scene scene = new Scene(root,400,400);
    
                SwingNode swingNode = new SwingNode();
                JButton jButton = new JButton("I am a Swing button");
                jButton.addActionListener(new ActionListener() {
    
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("Message from Swing");
    
                    }
                });
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        swingNode.setContent(jButton);
                    }
                });
    
                root.setCenter(swingNode);
    
                primaryStage.setScene(scene);
                primaryStage.show();
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    顺便说一句,BorderPane 没有方法“add”(如您的评论行):

    您可以使用setCentersetTopsetBottomsetLeftsetRightNodes 添加到其中(就像您用来填充中心一样)。

    如果您的目标不是将 Swing 嵌入 JavaFX,只是为了使用 JavaFX 控件,您可以查看this article JavaFX 默认具有哪些控件。

    【讨论】:

    • 请注意,如果要混合使用 Swing 和 JavaFX,则需要为每个工具包使用正确的线程。需要在 AWT 事件调度线程上创建或至少添加到 SwingNode 中的按钮。在此处的代码示例中,您将其添加到 JavaFX 应用程序线程中,这违反了Swing's threading rules
    • 感谢@James_D 的评论,你完全正确。更新了示例以在SwingUtilities.invokeLater 中设置SwingNode 的内容。
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多