1. RingChart
AppRingChart.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import javafx.application.Application; import javafx.beans.binding.Bindings; import javafx.collections.*; import javafx.scene.Scene; import javafx.scene.chart.PieChart; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class AppRingChart extends Application { @Override public void start(Stage stage) { stage.setTitle("Imported Fruits"); stage.setWidth(500); stage.setHeight(500); ObservableList<PieChart.Data> pieChartData = createData(); pieChartData.forEach(e -> e.nameProperty().bind(Bindings.concat( e.getName(), " (", e.pieValueProperty(), ")"))); final FxRingChart chart = new FxRingChart(pieChartData); chart.setTitle("Imported Fruits"); Scene scene = new Scene(new StackPane(chart)); stage.setScene(scene); stage.show(); } private ObservableList<PieChart.Data> createData() { return FXCollections.observableArrayList( new PieChart.Data("Grapefruit", 13), new PieChart.Data("Oranges", 25), new PieChart.Data("Plums", 10), new PieChart.Data("Pears", 22), new PieChart.Data("Apples", 30)); } public static void main(String[] args) { launch(args); } } |
RingChart.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | import javafx.collections.ObservableList; import javafx.geometry.Bounds; import javafx.scene.Node; import javafx.scene.chart.PieChart; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; public class FxRingChart extends PieChart { private final Circle innerCircle; public FxRingChart(ObservableList<Data> pieData) { super(pieData); innerCircle = new Circle(); //innerCircle.setFill(new ImagePattern(yourImage)) innerCircle.setFill(Color.WHITESMOKE); innerCircle.setStroke(Color.WHITE); innerCircle.setStrokeWidth(3); } @Override protected void layoutChartChildren(double top, double left, double contentWidth, double contentHeight) { super.layoutChartChildren(top, left, contentWidth, contentHeight); addInnerCircleIfNotPresent(); updateInnerCircleLayout(); } private void addInnerCircleIfNotPresent() { if (getData().size() > 0) { Node pie = getData().get(0).getNode(); if (pie.getParent() instanceof Pane) { Pane parent = (Pane) pie.getParent(); if (!parent.getChildren().contains(innerCircle)) { parent.getChildren().add(innerCircle); } } } } private void updateInnerCircleLayout() { double minX = Double.MAX_VALUE, minY = Double.MAX_VALUE; double maxX = Double.MIN_VALUE, maxY = Double.MIN_VALUE; for (PieChart.Data data: getData()) { Node node = data.getNode(); Bounds bounds = node.getBoundsInParent(); if (bounds.getMinX() < minX) { minX = bounds.getMinX(); } if (bounds.getMinY() < minY) { minY = bounds.getMinY(); } if (bounds.getMaxX() > maxX) { maxX = bounds.getMaxX(); } if (bounds.getMaxY() > maxY) { maxY = bounds.getMaxY(); } } innerCircle.setCenterX(minX + (maxX - minX) / 2); innerCircle.setCenterY(minY + (maxY - minY) / 2); innerCircle.setRadius((maxX - minX) / 4); } } |
댓글 없음:
댓글 쓰기