how to put JavaFX in JPanel?

2019-09-27 10:05发布

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条回答
一纸荒年 Trace。
2楼-- · 2019-09-27 10:54

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:

barchart in swing

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.

查看更多
登录 后发表回答