2013-12-04 21 views
6

Hiện tại tôi đang làm việc trên ứng dụng Jax Rs và tôi muốn xuất hình ảnh được mã hóa Base64 cho máy khách. Khách hàng là một thiết bị di động.Tạo hình ảnh ở phía máy chủ bằng cách sử dụng Java FX

Thiết bị di động sẽ gọi dịch vụ này với một số thông số và máy chủ phải vẽ biểu đồ thanh và gửi lại thiết bị dưới dạng chuỗi hình ảnh được mã hóa base64.

Vì java Fx có các thư viện biểu đồ bắt buộc, tôi đã làm mẫu bằng cách sử dụng hướng dẫn sau đây. Chức năng "snapshot" cũng hoạt động chính xác như mong đợi (để tạo ra một hình ảnh của màn hình).

http://docs.oracle.com/javafx/2/charts/bar-chart.htm#CIHJFHDE

Bây giờ tôi muốn làm điều này mà không cần mở rộng lớp Application vì tôi cần phải này trong ứng dụng Jax Rs. Vì vậy, tôi chỉ có thể sử dụng api để tạo ra một BuffredImage và sau đó sử dụng để tạo chuỗi Base64.

Tôi đã tìm thấy cách để thực hiện việc này bằng cách sử dụng JFreeChart. Nhưng tôi thích nếu tôi có thể làm điều này bằng cách sử dụng Java FX. Tôi không có bất kỳ kinh nghiệm trước đây với Java Fx

Xin tư vấn

Trả lời

8

Server dựa JavaFX runtime Khởi

Để chạy JavaFX trên máy chủ bạn cần phải hoặc là:

  1. Launch một JavaFX Application HOẶC
  2. Sử dụng JFXPanel.

Đó là những cách duy nhất để có được hệ thống thời gian chạy JavaFX được khởi tạo trong JavaFX 2 để bạn có thể sử dụng nó.

Sử dụng JFXPanel có lẽ là cách xử lý kém hiệu quả hơn một chút so với sử dụng Ứng dụng JavaFX.

Có thêm thảo luận về việc khởi tạo hệ thống JavaFX trong câu hỏi StackOverflow: JavaFX 2.1: Toolkit not initialized.

JavaFX là một hệ thống duy nhất luồng

Bạn có thể tạo hầu hết các thành phần JavaFX trong bất kỳ chủ đề. Tuy nhiên để hiển thị các thành phần trong một cảnh, bạn phải thực hiện công việc trên luồng ứng dụng JavaFX. Điều này có nghĩa rằng nếu bạn có một quy trình máy chủ đa luồng, mà hầu hết các máy chủ đều có, và bạn muốn tạo nhiều biểu đồ, bạn sẽ cần phải đơn luồng các yêu cầu hiển thị biểu đồ sử dụng các ràng buộc đồng thời.

  1. Khi bạn nhận được yêu cầu đến biểu đồ, hãy đưa ra lệnh Platform.runLater. Tất cả mã trong khối runLater sẽ được đặt trong một hàng đợi mà cuối cùng sẽ chạy trên chuỗi ứng dụng JavaFX.
  2. Trong khối runLater tạo ra một cảnh cho biểu đồ của bạn và chụp nhanh nó vào một hình ảnh. Các callback version of snapshot có thể là một trong những thích hợp nhất để sử dụng ở đây vì nó có khả năng không tie lên JavaFX Application Thread càng nhiều, mặc dù nó có khả năng tricker để sử dụng.
  3. Chuyển đổi hình ảnh JavaFX thành hình ảnh AWT bằng cách sử dụng SwingFXUtils.fromFXImage.
  4. Để đưa kết quả hình ảnh của bạn trở lại trong chuỗi xử lý máy chủ của bạn, hãy sử dụng kỹ thuật FutureTask được vạch ra bởi sarcan tại: Return result from javafx platform runlater.

Chuỗi xử lý máy chủ của bạn sau đó có thể sử dụng ImageIO để chuyển đổi hình ảnh AWT thành luồng đầu ra theo định dạng như png. Bạn có thể lấy luồng kết quả và Base64 encode it và yêu cầu máy chủ trả về luồng mã hóa cơ sở 64 để đáp ứng với cuộc gọi yêu cầu hình ảnh ban đầu.

Đảm bảo tắt máy duyên dáng

Bạn sẽ muốn gọi Platform.setImplicitExit(false) khi máy chủ của bạn khởi động và đăng ký một cái móc shutdown hoặc một ServletContextListener theo dõi khi servlet đang bị hủy hoại, do đó bạn cũng gọi Platform.exit() để tắt Hệ thống JavaFX. Nếu bạn không làm điều này, có khả năng máy chủ của bạn sẽ không thể tắt sạch vì chuỗi ứng dụng JavaFX sẽ tiếp tục chạy đang chờ công việc để làm.

JavaFX 2.2 là không thực sự được chứng nhận để chạy trên một máy chủ không đầu

ứng dụng Swing có thể run in headless mode sử dụng một hệ thống sở hữu java.awt.headless. Tôi không nhận thức được một tài sản tương tự cho JavaFX, mặc dù có thể có một và, nếu có, bạn có thể tìm hiểu nó là gì bằng cách yêu cầu openjfx-dev mailing list.

JavaFX được thiết kế chủ yếu như một bộ công cụ đồ họa khách hàng. Trong khi bạn có thể làm cho nó hoạt động và chạy thỏa đáng cho ứng dụng của bạn trên máy chủ, bạn có thể cần phải đảm bảo rằng máy chủ không được thiết lập là headless server và nó có thẻ tăng tốc đồ họa thích hợp để cung cấp hiệu suất hợp lý dưới tải .

Bạn có thể gửi yêu cầu hỗ trợ chính thức cho chế độ không đầu trong số JavaFX issue tracker.

+0

Tôi nghĩ rằng JFXPanel sẽ giải quyết được vấn đề của tôi. Nhưng tôi nghĩ tốt hơn là nên bắt đầu một luồng mới từ phía máy chủ và thực hiện logic Java FX. Cảm ơn bạn .. –

+0

Tôi đã chỉnh sửa câu trả lời của mình để cung cấp lời khuyên triển khai bổ sung. – jewelsea

+0

Tôi cũng có tất cả các câu hỏi này khi tôi cố gắng thực hiện điều này bằng cách sử dụng JFXPanel. Xử lý chủ đề đặc biệt. Đối với vấn đề máy chủ không đầu tôi tìm thấy câu trả lời trên http://stackoverflow.com/questions/17940329/javafx-for-server-side-image-generation này. Nhưng tôi vẫn chưa thử. Cảm ơn bạn đã trả lời chi tiết như vậy –

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