2013-03-06 28 views
5

từ mã này tôi có thể tạo biểu đồ thanh 10 thanh bây giờ tôi muốn biết làm thế nào để hiển thị giá trị của mỗi thanh trên cùng của thanh giống như hình ảnh kèm theo: enter image description herelàm thế nào để hiển thị giá trị thanh trên thanh JavaFX

ở đây là mã:

public class BarChartSample extends Application { 


    @Override public void start(Stage stage) { 
     stage.setTitle("Bar Chart Sample"); 
     final CategoryAxis xAxis = new CategoryAxis(); 
     final NumberAxis yAxis = new NumberAxis(); 
     final BarChart<String,Number> bc = 
      new BarChart<String,Number>(xAxis,yAxis); 
     bc.setTitle("Country Summary"); 
     xAxis.setLabel("bars");  
     yAxis.setLabel("Value"); 

     XYChart.Series series1 = new XYChart.Series(); 
     series1.setName("...");  

for(int i=0;i<10;i++) 
{ 
    //here i want to change color of bar if value of i is >5 than red if i>8 than blue 
series1.getData().add(new XYChart.Data("Value", i)); 

}   

} 

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

http://stackoverflow.com/a/41494789/4469105 liên quan – r3r57

Trả lời

14

Bên trong một ChangeListener cho tài sản node mục mỗi dữ liệu, bạn có thể gọi hàm sau để thêm một nhãn để phía trên cùng của thanh:

private void displayLabelForData(XYChart.Data<String, Number> data) { 
    final Node node = data.getNode(); 
    final Text dataText = new Text(data.getYValue() + ""); 
    node.parentProperty().addListener(new ChangeListener<Parent>() { 
    @Override public void changed(ObservableValue<? extends Parent> ov, Parent oldParent, Parent parent) { 
     Group parentGroup = (Group) parent; 
     parentGroup.getChildren().add(dataText); 
    } 
    }); 

    node.boundsInParentProperty().addListener(new ChangeListener<Bounds>() { 
    @Override public void changed(ObservableValue<? extends Bounds> ov, Bounds oldBounds, Bounds bounds) { 
     dataText.setLayoutX(
     Math.round(
      bounds.getMinX() + bounds.getWidth()/2 - dataText.prefWidth(-1)/2 
     ) 
    ); 
     dataText.setLayoutY(
     Math.round(
      bounds.getMinY() - dataText.prefHeight(-1) * 0.5 
     ) 
    ); 
    } 
    }); 
} 

Mã này hoạt động bằng cách thêm một nhãn văn bản cho phụ huynh của mỗi nút thanh, sau đó tự động định vị nhãn văn bản dựa trên giới hạn của thanh và văn bản mỗi khi thanh được thay đổi kích thước.

Tôi đã tạo một sample solution cho việc này.

labeledchartwithlegend

+0

trong khi biên dịch mã của bạn, nó cho phép toán tử lỗi <<> 'không được phép cho cấp nguồn dưới 1.7 tại BarChart cuối cùng bc = new BarChart <> (xAxis, yAxis) ; – H4SN

+0

Mã được viết cho Java 7 bằng cách sử dụng [toán tử kim cương] (http://docs.oracle.com/javase/7/docs/technotes/guides/language/type-inference-generic-instance-creation.html). Bạn có thể thiết lập trình biên dịch của bạn chấp nhận nguồn Java 7 ở mức tối thiểu (tùy chọn [javac] (http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html) '-source 7 ') hoặc thay đổi câu lệnh thành' BarChart bc = new BarChart (xAxis, yAxis); ', là nguồn tương thích với Java 6. Lưu ý rằng ngay cả khi bạn đang sử dụng jdk7 +, bạn có thể được biên dịch cho một mức nguồn dưới đây 7. – jewelsea

+0

Cảm ơn bạn rất nhiều công trình mã :) :) – H4SN

0

Không có tùy chọn nào trong JFX, về nhãn hiển thị cho một thanh trong barchart.

Điều bạn có thể làm là mở rộng lớp biểu đồ thanh và ghi đè các phương pháp về tạo và phân bổ nội dung.

Bạn có thể quan sát mã biểu đồ trong dự án javafx-ui-charts mà bạn có thể tải xuống từ kho lưu trữ OpenJFX.

Mã của bảng xếp hạng không phải là khó hiểu ...

Tải rt-kho từ http://hg.openjdk.java.net/openjfx/8/master/rt

Tìm dự án JavaFX-ui-bảng xếp hạng và mở nó. Tìm triển khai biểu đồ thanh.

+0

tôi đã tìm kiếm phân bổ nhưng không có may mắn, bạn có thể cung cấp một ví dụ hoặc nếu bạn có thể chỉnh sửa mã của tôi .. cảm ơn vì intrest bạn – H4SN

+0

Đã thêm liên kết vào mã mở biểu đồ repo –

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