我试图创建一个模式对话框,要求用户输入。我的程序使用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());
}
});
}
}
下面的代码是概念证明。
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’