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(); } }