【问题标题】:Javafx Donut Chart in FXMLFXML 中的 Javafx 圆环图
【发布时间】:2014-08-14 13:30:36
【问题描述】:

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

我的工作非常好,但是因为我使用 FXML 来制作我的 GUI,所以我不能使用这个示例。首先,我尝试将 DoughtnutChart.java 类作为 @FXML var 添加到要插入它的面板的控制器类中,但启动错误。

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

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

非常感谢。

【问题讨论】:

  • 我首先想到的是。使用 shape-circle 并将两个东西都放入 Stack 窗格中。将圆形放在饼图的顶部。Woala .. - Donut
  • 您应该能够相当轻松地在 FXML 中使用您自己的类(SceneBuilder 是另一回事)。你遇到了什么错误?
  • 我得到的错误是我不能使用“DoughtnutChart”作为常规 FXML PieChart 的控制器。
  • 您可以编辑您的问题并发布一些代码(以及确切的错误消息)吗?您应该可以直接在 FXML 中使用 <DoughnutChart>,就像使用 <PieChart> 一样。它不是控制器,而是Node

标签: java charts javafx fxml pie-chart


【解决方案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);
    }
}

完全按预期工作。

【讨论】:

    【解决方案2】:

    我必须在 James_D 答案中将 this 替换为 super 才能使其正常工作。

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

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      相关资源
      最近更新 更多