diff --git a/xchart-demo/pom.xml b/xchart-demo/pom.xml
index e9e96d7a..49775f0d 100644
--- a/xchart-demo/pom.xml
+++ b/xchart-demo/pom.xml
@@ -16,6 +16,7 @@
true
+ 17.0.20
@@ -49,15 +50,17 @@
webp-imageio
0.11.0
+
org.openjfx
javafx-swing
- 11.0.2
+ ${javafx.version}
org.openjfx
javafx-controls
- 11.0.2
+ ${javafx.version}
diff --git a/xchart-demo/src/main/java/org/knowm/xchart/standalone/JavaFXDemo.java b/xchart-demo/src/main/java/org/knowm/xchart/standalone/JavaFXDemo.java
index b720fccc..a3a16537 100644
--- a/xchart-demo/src/main/java/org/knowm/xchart/standalone/JavaFXDemo.java
+++ b/xchart-demo/src/main/java/org/knowm/xchart/standalone/JavaFXDemo.java
@@ -2,14 +2,22 @@
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
+import javafx.geometry.Insets;
import javafx.scene.Scene;
+import javafx.scene.control.Button;
+import javafx.scene.control.ButtonBar;
+import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
+import javafx.scene.layout.VBox;
import javafx.stage.Stage;
-import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
import org.knowm.xchart.XChartPanel;
import org.knowm.xchart.demo.charts.area.AreaChart01;
-/** Class showing how to integrate a chart into a JavaFX Stage */
+/**
+ * Class showing how to integrate a chart into a JavaFX Stage, embedded in a layout container
+ * (VBox) alongside other controls so that everything resizes with the window.
+ */
public class JavaFXDemo extends Application {
public static void main(String[] args) {
@@ -21,10 +29,24 @@ public static void main(String[] args) {
public void start(Stage stage) {
final SwingNode swingNode = new SwingNode();
- JPanel chartPanel = new XChartPanel<>(new AreaChart01().getChart());
- swingNode.setContent(chartPanel);
- Scene scene = new Scene(new StackPane(swingNode), 640, 480);
- stage.setScene(scene);
+ // Swing content must be created on the Swing Event Dispatch Thread
+ SwingUtilities.invokeLater(
+ () -> swingNode.setContent(new XChartPanel<>(new AreaChart01().getChart())));
+
+ // A VBox gives each child its preferred height only; wrap the SwingNode in a resizable pane
+ // and mark it to grow so the chart fills the space left over by the other controls.
+ StackPane chartHolder = new StackPane(swingNode);
+ VBox.setVgrow(chartHolder, Priority.ALWAYS);
+
+ Button closeButton = new Button("Close");
+ closeButton.setOnAction(event -> stage.close());
+ ButtonBar buttonBar = new ButtonBar();
+ buttonBar.getButtons().add(closeButton);
+
+ VBox root = new VBox(10, chartHolder, buttonBar);
+ root.setPadding(new Insets(10));
+
+ stage.setScene(new Scene(root, 640, 480));
stage.show();
}
}