我想在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上实现这个圆环图?
非常感谢。
答案 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);
}