当前位置: 首页 > 知识库问答 >
问题:

将JFXPanel添加到JDialog

裘兴思
2023-03-14

我试图创建一个模式对话框,要求用户输入。我的程序使用Swing构建gui,但由于我想用css设计组件,所以我使用JFXPanels而不是常规的JPanel。当我将JFXPanel添加到JFrame时,一切正常,但如果我尝试将JFXPanel添加到JDialog,JDialog不会显示任何内容。

我正在使用JDK 11。

我错过了什么?

这是我的代码:

import java.util.Optional;
import javafx.application.Platform;
import javafx.collections.ObservableList;
import javafx.embed.swing.JFXPanel;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javax.swing.JDialog;
import javax.swing.JFrame;

public class JDialogExample {

    private Optional<String> output = Optional.empty();
    private final StackPane stackPane = new StackPane(); 
    private final JFXPanel panel = new JFXPanel();
    private final JDialog dialog = getNewJDialog();
    private final TextField tf = new TextField();

    public JDialogExample() {
        ObservableList list = stackPane.getChildren(); 
        list.addAll(new Label("My Label"), tf, getSubmitButton());
        panel.setScene(new Scene(stackPane));
        dialog.add(panel);
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);
    }

    public Optional<String> show() {
        return output;
    }

    private Button getSubmitButton() {
        Button btn = new Button();
        btn.setText("Submit");
        btn.setOnAction(new EventHandler<>() {
            @Override
            public void handle(javafx.event.ActionEvent t) {
                output = Optional.of(tf.getText());
                dialog.setVisible(false);
            }
        });
        return btn;
    }

    protected JDialog getNewJDialog() {
        return new JDialog(new JFrame(), "My dialog", true);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Platform.startup(()
                -> {
            JDialogExample e = new JDialogExample();
            Optional<String> userInputOptional = e.show();
            if(userInputOptional.isPresent()){
                System.out.println(userInputOptional.get());
            }
        });
    }

}

共有1个答案

隆飞宇
2023-03-14

下面的代码是概念证明。

import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;

public class JfxSwing {
    private FxDialog  fxDlg;
    private JFrame  frame;

    private void createAndDisplayGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton button = new JButton("Show Dlg");
        button.addActionListener(this::showDialog);
        frame.add(button);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private void showDialog(java.awt.event.ActionEvent event) {
        if (fxDlg == null) {
            fxDlg = new FxDialog(frame);
            fxDlg.pack();
        }
        fxDlg.setVisible(true);
        String str = fxDlg.getText();
        System.out.printf("^%s^ [Length: %d]%n", str, (str != null ? str.length() : -1));
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new JfxSwing().createAndDisplayGui());
    }
}


class FxDialog extends JDialog {
    private JFXPanel  fxPanel;
    private String  text;

    public FxDialog(JFrame owner) {
        super(owner, "FxDlg", true);
        fxPanel = new JFXPanel();
        fxPanel.setPreferredSize(new Dimension(100, 100));
        add(fxPanel);
        Platform.runLater(this::initFx);
        setLocationRelativeTo(owner);
    }

    public String getText() {
        return text;
    }

    private void initFx() {
        TextField tf = new TextField();
        Button submit = new Button("Submit");
        submit.setOnAction(e -> {
            text = tf.getText();
            EventQueue.invokeLater(() -> setVisible(false));
        });
        VBox root = new VBox(10.0d);
        root.getChildren().addAll(new Label("My Label"), tf, submit);
        Scene scene = new Scene(root);
        fxPanel.setScene(scene);
    }
}

请注意,在上面的代码中,这一行将阻塞(即不会返回),直到JDialog关闭。

fxDlg.setVisible(true);

还要记住,Swing代码必须在事件调度线程(EDT)上运行,JavaFX代码必须在JavaFX应用程序线程上运行。

在编写上述代码时,我参考了以下网页
将JavaFX集成到Swing应用程序中

 类似资料:
  • 我很难知道如何将我的JFXPanel(它是一个mp3播放器)集成到一个现有的Swing应用程序中,该应用程序是一个JFrame,其中添加了几个不同的JPanel。我对JavaFX是一个完全的noob,它与Swing非常不同。 我能够得到下面的代码来运行和做我想做的事情。它将播放mp3文件从一个目录,我有他们包含在。这是某人编写的示例中的代码。我的问题是,这段代码创建了JFrame,有main方法和

  • 问题内容: RelativeLayout layout = new RelativeLayout(this); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); View gameView = initializeForView(new MainGame(), config); 什么也没显

  • 问题内容: 现在,我正在通过jquery加载iframe: 我有一个自定义样式表,希望将其应用于该页面。iframe中的页面不在同一域中,这就是为什么它很棘手的原因。我找到了允许您添加单个标签但不能添加整个样式表的解决方案。 编辑: 有问题的页面通过Mobile Safari 加载,因此跨域策略不适用。 问题答案: 基于解决方案您已经找到了如何将CSS应用于iframe?: 或更多jqueryis

  • 问题内容: 我有一个gui,它的Panel包含一系列标签和TextField,并使用spring布局(这是mainPanel),而另一个Panel仅包含button(buttonPanel)。我正在尝试使我的mainPanel也具有垂直滚动条。我想实现我的GUI,以便在JFrame中有2个面板。mainPanel出现在框架的顶部,而buttonPanel出现在mainPanel的下方。 我的问题是

  • 问题内容: 我正在尝试使用standard共享图像,可以使用以下代码在 Facebook , Twitter 和 Save Image 上 共享: 我还需要一件事, Instagram : 这两个代码分别工作正常,如何将 Instagram 添加到?有可能吗? 问题答案: 我认为将其他社交共享添加到您为Instagram编写的代码中会更加容易。“ .igo”扩展名是Instagram专有的,因此其

  • 问题内容: 我今天在这个主题上搜索了很多。但是我找不到它,如何将JSONArray添加到JSONObject? 因为每次执行此操作都会收到此错误:Stackoverflow 我收到此错误: 我想要的JSON:只有最后一个JsonArray出问题了: ,“ vloer”:[{formaat:’vierkant10x15’tegels:[{naam:’‘,imgThumb:’/bla/bla.png’