how to put JavaFX in JPanel?

2019-09-27 10:46发布

问题:

I have a swing program and i am trying to incorporate a JavaFX bar graph in my program.

How can I put it in a JPanel?

or

Is there a way to put this code in a ActionListerner? So I can run it after pressing a button.

public static void start(Stage stage) {
    String judge1 = "Judge 1";
    String judge2 = "Judge 2";
    String judge3 = "Judge 3";

    final CategoryAxis xAxis = new CategoryAxis();
    final NumberAxis yAxis = new NumberAxis();
    final BarChart<String,Number> bc = 
        new BarChart<String,Number>(xAxis,yAxis);

    xAxis.setLabel("Judges");       
    yAxis.setLabel("Run");

    XYChart.Series series1 = new XYChart.Series();
    series1.setName("Run 1");       
    series1.getData().add(new XYChart.Data(judge1, 1));
    series1.getData().add(new XYChart.Data(judge2, 3));
    series1.getData().add(new XYChart.Data(judge3, 2));

    XYChart.Series series2 = new XYChart.Series();
    series2.setName("Run 2");
    series2.getData().add(new XYChart.Data(judge1, 5));
    series2.getData().add(new XYChart.Data(judge2, 4);
    series2.getData().add(new XYChart.Data(judge3, 4));

    Scene scene  = new Scene(bc,800,600);
    bc.getData().addAll(series1, series2);
    stage.setScene(scene);
    stage.show();
}

回答1:

Use a JFXPanel.

From the documentation =>

public class Test {
   private static void initAndShowGUI() {
       // This method is invoked on Swing thread
       JFrame frame = new JFrame("FX");
       final JFXPanel fxPanel = new JFXPanel();
       frame.add(fxPanel);
       frame.setVisible(true);

       Platform.runLater(new Runnable() {
           @Override
           public void run() {
               initFX(fxPanel);
           }
       });
   }

   private static void initFX(JFXPanel fxPanel) {
       // This method is invoked on JavaFX thread
       Scene scene = createScene();
       fxPanel.setScene(scene);
   }

   public static void main(String[] args) {
       SwingUtilities.invokeLater(new Runnable() {
           @Override
           public void run() {
               initAndShowGUI();
           }
       });
   }
}

Oracle even have a tutorial on exactly the case you are asking:

  • Embedding a JavaFX BarChart in a Swing application.

In general, I'd advise just using JavaFX only (or Swing only) and not mixing JavaFX and Swing unless you have really good reasons to do so.