2016-09-28 24 views
8

Tôi chỉ muốn tạo một hình ảnh biểu đồ từ API biểu đồ JavaFX. Tôi không muốn hiển thị cửa sổ ứng dụng hoặc khởi chạy ứng dụng (nếu không cần thiết).Sử dụng API biểu đồ JavaFX để vẽ hình ảnh biểu đồ

public class LineChartSample extends Application { 
    private List<Integer> data; 

    @Override public void start(Stage stage) { 
     stage.setTitle("Line Chart Sample"); 
     final CategoryAxis xAxis = new CategoryAxis(); 
     final NumberAxis yAxis = new NumberAxis(); 
     xAxis.setLabel("Month");  

     final LineChart<String,Number> lineChart = 
       new LineChart<String,Number>(xAxis,yAxis); 

     lineChart.setTitle("Stock Monitoring, 2010"); 

     XYChart.Series series = new XYChart.Series(); 
     series.setName("My portfolio"); 

     series.getData().add(new XYChart.Data("Jan", 23)); 
     series.getData().add(new XYChart.Data("Feb", 14));   

     Scene scene = new Scene(lineChart,800,600); 
     lineChart.getData().add(series); 

     WritableImage image = scene.snapshot(null); 
     ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", chartFile); 

     //stage.setScene(scene); 
     //stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

    public setData(List<Integer> data) {this.data = data;} 
} 

Bên trong phương pháp bắt đầu, tôi thực sự cần phải truy cập vào dữ liệu bên ngoài để xây dựng dữ liệu chuỗi, nhưng có vẻ không có cách nào để truy cập dữ liệu bên ngoài từ phương pháp bắt đầu, nếu tôi lưu trữ các dữ liệu bên trong biến thành viên data, không có giá trị khi bắt đầu được gọi. Tôi thực sự không quan tâm đến đối tượng sân khấu và cảnh, miễn là hình ảnh biểu đồ có thể được hiển thị, tôi nên giải quyết vấn đề như thế nào? Tôi muốn xây dựng một API có thể được gọi với dữ liệu đầu vào và vẽ biểu đồ với dữ liệu và trả về tệp.

public File toLineChart(List<Integer> data) { 
... 
} 
+0

tôi nghĩ rằng những gì bạn muốn làm là FIRST: sử dụng một máy quét để đọc dữ liệu từ một tập tin và lưu trữ vào một mảng hoặc một số loại dữ liệu khác. TIẾP THEO: Bạn nên chuyển thông tin được lưu trữ đó vào phương thức toLineChart của mình. Phương thức toLineChart nên sử dụng một số ý tưởng được liệt kê dưới đây để in biểu đồ. Câu hỏi lớn như thế nào là dữ liệu gốc được lưu trữ? Là nó trong một tập tin văn bản hoặc cơ sở dữ liệu? – Sedrick

Trả lời

6

Bạn không cần phải chứng minh một Stage nhưng Node phải được gắn liền với một Scene. Từ doc of snapshot:

GHI CHÚ: Để cho CSS và bố trí để hoạt động tốt, nút phải là một phần của một Scene (các cảnh có thể được gắn liền với một giai đoạn, nhưng không cần được).

Một hạn chế để sửa đổi một Scene là, rằng nó phải xảy ra trên J avaFX Application Chủ đề, trong đó có các điều kiện tiên quyết rằng JavaFX Toolkit phải được khởi tạo.

Việc khởi có thể thực hiện bằng cách mở rộng các lớp Application nơi phương pháp launch sẽ làm điều đó cho bạn, hoặc như một cách giải quyết bạn có thể tạo một JFXPanel dụ mới trên Swing Event Dispatcher Chủ đề.

Nếu bạn đang mở rộng Application và bạn thực hiện một số mã trong phương pháp start, nó được đảm bảo rằng mã này sẽ được thực hiện trên JavaFX Application Chủ đề, nếu không bạn có thể sử dụng các khối Platform.runLater(...) gọi từ một thread khác nhau để đảm bảo giống nhau.

Dưới đây là một ví dụ tốt:

Lớp cung cấp một phương pháp tĩnh để vẽ một biểu đồ vào một tập tin và trả về File hoặc null nếu việc tạo ra thành công hay không.

Trong phương pháp này các JavaFX Toolkit được khởi tạo bằng cách tạo ra một JFXPanel trên Swing EDT sau đó việc tạo ra biểu đồ được thực hiện JavaFX Application Chủ đề. Hai boolean được sử dụng trong phương thức để lưu trữ rằng hoạt động được hoàn thành và thành công.

Phương thức sẽ không trả lại cho đến khi cờ hoàn thành chuyển thành true.

Lưu ý: Đây thực sự chỉ là một ví dụ (hoạt động) có thể cải thiện rất nhiều.

public class JavaFXPlotter { 

    public static File toLineChart(String title, String seriesName, List<Integer> times, List<Integer> data) { 

     File chartFile = new File("D:\\charttest.png"); 

     // results: {completed, successful} 
     Boolean[] results = new Boolean[] { false, false }; 

     SwingUtilities.invokeLater(() -> { 

      // Initialize FX Toolkit 
      new JFXPanel(); 

      Platform.runLater(() -> { 
       final NumberAxis xAxis = new NumberAxis(); 
       final NumberAxis yAxis = new NumberAxis(); 

       final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis); 

       lineChart.setTitle(title); 

       XYChart.Series<Number, Number> series = new XYChart.Series<>(); 
       series.setName(seriesName); 

       for (int i = 0; i < times.size(); i++) 
        series.getData().add(new XYChart.Data<Number, Number>(times.get(i), data.get(i))); 

       lineChart.getData().add(series); 

       Scene scene = new Scene(lineChart, 800, 600); 

       WritableImage image = scene.snapshot(null); 

       try { 
        ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", chartFile); 
        results[1] = true; 
       } catch (Exception e) { 
        results[0] = true; 
       } finally { 
        results[0] = true; 
       } 
      }); 
     }); 

     while (!results[0]) { 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     return (results[1]) ? chartFile : null; 
    } 


} 

và sử dụng có thể

List<Integer> times = Arrays.asList(new Integer[] { 0, 1, 2, 3, 4, 5 }); 
List<Integer> data = Arrays.asList(new Integer[] { 4, 1, 5, 3, 0, 7 }); 

File lineChart = JavaFXPlotter.toLineChart("Sample", "Some sample data", times, data); 

if (lineChart != null) 
    System.out.println("Image generation is done! Path: " + lineChart.getAbsolutePath()); 
else 
    System.out.println("File creation failed!"); 

System.exit(0); 

và hình ảnh được tạo ra (charttest.png)

enter image description here

1

Từ dòng lệnh:

import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.embed.swing.SwingFXUtils; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 
import javafx.scene.chart.*; 
import javafx.scene.Group; 
import javafx.scene.image.WritableImage; 
import javax.imageio.ImageIO; 

public class PieChartSample extends Application { 

    private static String[] arguments; 

    @Override public void start(Stage stage) { 
     Scene scene = new Scene(new Group()); 
     stage.setTitle("Imported Fruits"); 
     stage.setWidth(500); 
     stage.setHeight(500); 

     ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(); 

//    
     final PieChart chart = new PieChart(pieChartData); 
     chart.setTitle("Imported Fruits"); 
     for(int i = 0; i < arguments.length; i+=2) 
     { 
      System.out.println(arguments[i] + " " + arguments[i+1]); 
      chart.getData().add(new PieChart.Data(arguments[i], Double.parseDouble(arguments[i+1]))); 
     } 

     ((Group) scene.getRoot()).getChildren().add(chart); 

     saveAsPng(scene); 
     System.out.println("Done!"); 
     System.exit(0); 
     //stage.setScene(scene); 
     //stage.show(); 
    } 

    public static void main(String[] args) { 
     arguments = args; 
     launch(args); 
    } 

    static void saveAsPng(Scene scene){ 
     try 
     { 
      WritableImage image = scene.snapshot(null); 

      File file = new File("tempPieChart.png"); 

      ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", file); 
     } 
     catch (IOException ex) 
     { 
      Logger.getLogger(PieChartSample.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
} 

Tiếp theo: Làm sạch và tạo chương trình của bạn. Sau đó: Tìm bạn file jar trong thư mục TP của bạn Sau đó: Điều hướng cửa sổ lệnh của bạn vào thư mục TP jar của bạn là trong Sau đó chạy:. Java -jar PieChartSample.jar Banana 14 Orange 20 nho 15

enter image description here

Kết quả: Nằm trong cùng thư mục với file PieChartSample.jar bạn

enter image description here

Các vấn đề liên quan