我有一个现有的Swing应用程序,我正在向其添加JavaFX组件。我希望我的一个嵌入式JFXPanel
能够使用Stage
显示一个弹出式对话框,并且Stage
与现有的JFrame
作为其所有者是模态的。
Stage
模式设置为Modality.APPLICATION_MODAL
,并将其所有者设置为JFXPanel
中Scene
的Window
。
我如何使Stage
模态在Swing应用程序?
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.layout.BorderPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.BorderLayout;
import java.awt.Dimension;
public class App {
public static void main(String[] args) {
new App().run();
}
public void run() {
JFrame applicationFrame = new JFrame("JavaFX Mucking");
applicationFrame.setSize(new Dimension(300, 300));
JPanel content = new JPanel(new BorderLayout());
applicationFrame.setContentPane(content);
JFXPanel jfxPanel = new JFXPanel();
content.add(jfxPanel);
Platform.runLater(() -> jfxPanel.setScene(this.generateScene()));
applicationFrame.setVisible(true);
applicationFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
private Scene generateScene() {
Button button = new Button("Show Dialog");
Scene scene = new Scene(new BorderPane(button));
button.setOnAction(actionEvent -> {
Stage stage = new Stage(StageStyle.UTILITY);
stage.initOwner(scene.getWindow());
stage.initModality(Modality.APPLICATION_MODAL);
stage.setScene(new Scene(new Label("Hello World!")));
stage.sizeToScene();
stage.show();
});
return scene;
}
}
您生成了一个场景对象,将其放置在JFXPanel中,而JFXPanel则放置在JFrame中。与此同时,你在舞台中放置了与主场景对象相同的场景。
同一个场景不能同时出现在两个不同的地方。要创建模态对话框,只需使用Stage对象,因为Stage和JFrame都是来自两个不同gui库的顶层容器。
不要将场景添加到JFXPanel和Stage,只添加其中一个。