FXML中的Javafx Donut图表

时间:2014-08-14 13:30:37

标签: java charts javafx fxml pie-chart

我想在JavaFX上做一个甜甜圈/甜甜圈图表并搜索我来到这个例子:Can PieChart from JavaFX be displayed as a doughnut?

我工作得很好,但由于我使用FXML制作我的GUI,我不能使用这个例子。首先,我尝试将DoughtnutChart.java类作为@FXML var添加到我要插入它的面板的控制器类中,但是启动了错误。

然后,在Google中搜索以使DoughnutChart成为自定义组件,但所有示例都基于Panes。另外,如果我尝试将donu.jar导入SceneBuilder,则选择组件的窗口为空。

所以,我的问题是:当我在FXML上制作GUI时,如何在JavaFX上实现这个圆环图?

非常感谢。

2 个答案:

答案 0 :(得分:1)

如果没有看到FXML和错误消息,很难说出错误的原因。

我很容易使用它:要注意的一件事是FXMLLoader通过调用无参数构造函数来实例化类。如果找不到,则会尝试使用构建器类作为备份计划。因此,您需要对@jewelsea's DoughnutChart实现进行的一个修改是添加无参数构造函数。 (你也可以定义一个DoughnutClassBuilder,但这项工作要多得多,而且不会给你任何额外的好处。)所以我这样做了:

package doughnut ;

// imports as before...

public class DoughnutChart extends PieChart {
    private final Circle innerCircle;

    public DoughnutChart() {
        this(FXCollections.observableArrayList());
    }

    // everything else as before...

}

然后是以下FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.StackPane?>
<?import doughnut.DoughnutChart?>

<StackPane xmlns:fx="http://javafx.com/fxml" fx:controller="doughnut.SampleController">
    <DoughnutChart fx:id="doughnutChart" />

</StackPane>

使用控制器SampleController.java:

package doughnut;

import javafx.fxml.FXML;
import javafx.scene.chart.PieChart;

public class SampleController {
    @FXML
    private PieChart doughnutChart ;

    public void initialize() {
        doughnutChart.getData().addAll(
            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));

    }
}

和应用程序类

package doughnut;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
            StackPane root = (StackPane)FXMLLoader.load(getClass().getResource("DoughnutChartDemo.fxml"));
            Scene scene = new Scene(root,400,400);
            primaryStage.setScene(scene);
            primaryStage.show();
    }

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

完全符合预期。

答案 1 :(得分:0)

我必须在James_D的回答中将替换为超级才能使其正常运行。

对我来说,构造函数看起来像:

public DoughnutChart()
{
    super(FXCollections.observableArrayList());
    innerCircle = new Circle();

    // just styled in code for demo purposes,
    // use a style class instead to style via css.
    innerCircle.setFill(Color.WHITESMOKE);
    innerCircle.setStroke(Color.WHITE);
    innerCircle.setStrokeWidth(3);
}