2008-08-22 64 views

Trả lời

11

Tôi chưa sử dụng BIRT hoặc JGraph, tuy nhiên tôi sử dụng JFreeChart trong ứng dụng SWT của mình. Tôi đã tìm thấy cách tốt nhất để sử dụng JFreeChart trong SWT là tạo khung tổng hợp cho một khung AWT và sử dụng chức năng AWT cho JFreeChart. Các cách để làm điều này là bằng cách tạo ra một hỗn hợp

Composite comp = new Composite(parent, SWT.NONE | SWT.EMBEDDED); 
Frame frame = SWT_AWT.new_Frame(comp); 
JFreeChart chart = createChart(); 
ChartPanel chartPanel = new ChartPanel(chart); 
frame.add(chartPanel); 

Có một số vấn đề liên quan đến triển khai trên nhiều nền tảng khác nhau cũng như các mã SWT trong nó là rất nghèo (trong quốc phòng Ông Gilbert không biết SWT tốt và nó được thực hiện cho AWT). Hai vấn đề lớn nhất của tôi là sự kiện AWT bong bóng lên thông qua SWT có một số sự kiện sai lầm bị sa thải và do gói khung AWT JFreeChart trở nên chậm hơn đáng kể.

@zvikico

Ý tưởng đưa biểu đồ vào trang web có lẽ không phải là một cách tuyệt vời để thực hiện. Có một vài vấn đề đầu tiên là cách Eclipse xử lý tích hợp trình duyệt web trên các nền tảng khác nhau là không nhất quán. Ngoài ra từ sự hiểu biết của tôi về một vài gói đồ họa cho web họ là phía máy chủ yêu cầu thiết lập đó, cũng có nhiều công ty bao gồm máy chủ proxy của tôi sử dụng và đôi khi điều này tạo ra các vấn đề với duyệt web Eclipse.

+0

FYI, JFreeChart đã có tích hợp SWT thực nghiệm. Chúng tôi sử dụng nó thành công trong một ứng dụng sản xuất. –

+0

Thật không may giấy phép LGPL của JFreeChart không tương thích với Giấy phép Công cộng Eclipse (EPL). – Stefan

0

Ngoài ra còn có JGraph, nhưng tôi không chắc liệu đó có chỉ là đồ thị (tức là các nút và cạnh) hay không.

0

Dưới đây là một điều gì đó khác: nó rất nhúng các trang web trong chế độ xem SWT. Gần đây tôi đã thử nó và nó hoạt động rất tốt. Bạn có thể thấy nơi này đang diễn ra: có rất nhiều thành phần biểu đồ đẹp cho HTML, nó có thể là một tùy chọn. Chỉ cần đảm bảo thành phần chỉ là phía máy khách (trừ khi bạn muốn bắt đầu một máy chủ).

Tôi chưa thử nghiệm Flash, nhưng tôi khá chắc chắn bạn có thể làm cho nó hoạt động (một cách tự nhiên, điều này có nghĩa là phần mềm của bạn sẽ yêu cầu cài đặt plugin Flash).

1

Ngoài ra còn có ILOG JViews Charts trông khá đầy đủ tính năng ... nếu bạn có thể mua được. Here là một số thông tin bổ sung về việc sử dụng nó với nhật thực.

+0

JViews đã được RogueWave mua: http://www.roguewave.com/products/visualization/jviews/whats-new – Stefan

0

JCharts là một tùy chọn khác. Nó tương tự như JFreeChart nhưng tài liệu miễn phí. Nó không có hỗ trợ trực tiếp cho SWT nhưng bạn luôn có thể tạo một hình ảnh và nhúng nó vào khung SWT.

8

SWTChart cung cấp kết quả tốt cho biểu đồ đường, phân tán, vạch và khu vực. API là thẳng về phía trước và có rất nhiều ví dụ trên trang web. Tôi đã đi từ việc tìm kiếm nó trên google để xem dữ liệu của tôi trong vòng chưa đầy một giờ.

SWTChart

+0

SWTChart đi với biểu đồ dữ liệu thời gian thực như thế nào? Từ những gì tôi có thể nói, một chuỗi dữ liệu được tải vào toàn bộ biểu đồ và không có cách nào để cập nhật nó với các giá trị mới khi chúng có sẵn. Tôi đoán điều này chỉ liên quan đến tôi hiệu suất khôn ngoan. – akatkinson

+0

SWTChart được cấp phép theo EPL. – Stefan

+0

Dường như nó không hỗ trợ xuất khẩu svg hoặc png. – Stefan

2

Một Tôi đã sử dụng là JChart2D và JFreeChart. Tôi đã làm một ứng dụng vẽ trực tiếp vào mùa hè và sử dụng JFreeChart cho điều đó.Người đã bắt đầu dự án đã sử dụng JChart2D nhưng tôi thấy rằng nó không có đủ tùy chọn để chỉnh sửa giao diện biểu đồ.

JChart2D được cho là rất nhanh vì vậy nếu bạn cần thực hiện bản vẽ trực tiếp, hãy xem xét nó, mặc dù JFreeChart không gặp bất kỳ vấn đề gì khi thực hiện một âm mưu vài lần mỗi giây.

Ngoài ra còn khá một danh sách các thư viện biểu đồ trên java2s.com

+0

Cả hai JChart2D và JFreeChart được cấp phép theo LGPL. – Stefan

1

tôi đề nghị bạn thử jzy3d, thư viện java đơn giản vì âm mưu dữ liệu 3d. Nó dành cho java, trên AWT, Swing hoặc SWT.

+0

Jz3d được cấp phép theo BSD. – Stefan

5

Bạn có thể muốn this một quá

Nó có khả năng để vẽ dữ liệu thời gian thực với nhà cung cấp dữ liệu của riêng bạn.

enter image description here

+1

Nó bây giờ là một phần của các Widget Hình ảnh Tinh vân được cấp phép theo EPL và trang bắt đầu có tại đây: http://git.eclipse.org/c/nebula/org.eclipse.nebula.git/plain/widgets/visualization /org.eclipse.nebula.visualization.xygraph/html/GettingStarted.html – Stefan

2

Tôi cũng đang tìm kiếm một thư viện biểu đồ cho một ứng dụng Eclipse RCP, vấp vào bài Caleb ở đây và chắc chắn có thể khuyên SWTChart tại bản thân mình. Nó nhanh hơn rất nhiều so với JFreeChart cho tôi, cộng với dễ dàng mở rộng. Nếu tôi thực sự phải phàn nàn về một điều gì đó, tôi muốn nói javadoc có thể tiết lộ một chút, nhưng đây chỉ là để nói mọi thứ khác là tuyệt vời.

1

Sau khi đánh giá một số tùy chọn, tôi quyết định sử dụng thư viện JavaScript để hiển thị các ô trong Plugin Eclipse của tôi. Như zvikico đã gợi ý nó có thể hiển thị một trang html trong một trình duyệt. Trong trang html, bạn có thể sử dụng một trong các thư viện JavaScript để thực hiện âm mưu thực tế. Nếu bạn sử dụng Chartist, bạn có thể lưu hình ảnh dưới dạng tệp SVG từ menu ngữ cảnh.

Một số hoạt Javascript thư viện biểu đồ:

người vận động Ví dụ hình ảnh:

enter image description here

Ví dụ java đang:

package org.treez.results.chartist; 

import java.net.URL; 

import javafx.application.Application; 
import javafx.concurrent.Worker; 
import javafx.geometry.HPos; 
import javafx.geometry.VPos; 
import javafx.scene.Scene; 
import javafx.scene.layout.Region; 
import javafx.scene.paint.Color; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 
import netscape.javascript.JSObject; 

public class WebViewSample extends Application { 

    private Scene scene; 

    @Override 
    public void start(Stage stage) { 
     // create the scene 
     stage.setTitle("Web View"); 
     Browser browser = new Browser(); 
     scene = new Scene(browser, 750, 500, Color.web("#666970")); 
     stage.setScene(scene); 
     stage.show(); 
    } 

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

class Browser extends Region { 

    final WebView browser = new WebView(); 

    final WebEngine webEngine = browser.getEngine(); 

    public Browser() { 

     //add the web view to the scene 
     getChildren().add(browser); 

     //add finished listener 
     webEngine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> { 
      if (newState == Worker.State.SUCCEEDED) { 
       executeJavaScript(); 
      } 
     }); 

     // load the web page 
     URL url = WebViewSample.class.getResource("chartist.html"); 
     String urlPath = url.toExternalForm(); 
     webEngine.load(urlPath); 

    } 

    private void executeJavaScript() { 

     String script = "var chartist = new Chartist.Line(" + "'#chart'," + " " + "{" 
       + " labels: [1, 2, 3, 4, 5, 6, 7, 8]," + "series: [" + " [5, 9, 7, 8, 5, 3, 5, 44]" + "]" + "}, " + "" 
       + "{" + " low: 0," + " showArea: true" + "}" + "" + ");" + " var get = function(){return chartist};"; 

     webEngine.executeScript(script); 

     Object resultJs = webEngine.executeScript("get()"); 

     //get line 
     JSObject line = (JSObject) resultJs; 
     String getKeys = "{var keys = [];for (var key in this) {keys.push(key);} keys;}"; 
     JSObject linekeys = (JSObject) line.eval(getKeys); 

     JSObject options = (JSObject) line.eval("this.options"); 
     JSObject optionkeys = (JSObject) options.eval(getKeys); 

     options.eval("this.showLine=false"); 

    } 

    @Override 
    protected void layoutChildren() { 
     double w = getWidth(); 
     double h = getHeight(); 
     layoutInArea(browser, 0, 0, w, h, 0, HPos.CENTER, VPos.CENTER); 
    } 

    @Override 
    protected double computePrefWidth(double height) { 
     return 750; 
    } 

    @Override 
    protected double computePrefHeight(double width) { 
     return 500; 
    } 
} 

html trang Ví dụ:

<!DOCTYPE html> 
<html> 
<head> 
    <link rel="stylesheet" type="text/css" href="chartist.min.css">  
</head> 
<body> 
    <div class="ct-chart" id="chart"></div> 
    <script type="text/javascript" src="chartist.js"></script> 
</body> 
</html> 

Để làm việc này, chartist.js và chartist.min.css cần được tải xuống và đặt ở cùng vị trí với tệp html. Bạn cũng có thể đưa chúng từ web.Xem ở đây cho một ví dụ khác: https://www.snip2code.com/Snippet/233633/Chartist-js-example

Sửa

tôi đã tạo một wrapper java cho D3.js, xem

https://github.com/stefaneidelloth/javafx-d3

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