我从here“窃取”了一些代码,使AreaChart
具有“流畅的线条”,我在我的FXML中使用它并且有效:
<SmoothedAreaChart fx:id="chart" legendVisible="false"
title="Tree depth by line" animated="false">
<xAxis>
<NumberAxis fx:id="xAxis" tickUnit="1.0" autoRanging="false"
minorTickVisible="false" forceZeroInRange="false"
label="Line number"/>
</xAxis>
<yAxis>
<NumberAxis fx:id="yAxis" minorTickVisible="false"
tickUnit="1.0" forceZeroInRange="true" label="Tree depth"/>
</yAxis>
</SmoothedAreaChart>
然而我遇到的问题是Y轴。
我将tickUnit
设置为1.0
,因为我想要的是整数单位,但它不太有效:
如果在yAxis
的定义中,我将autoRanging
设置为false
,则会裁剪图表(我在填充图表时手动设置上限):
而且,也有太多刻度线。
基本上,我想要两者的行为:
是否有可能这样做,或者我是否需要编写自己的代码/找到Axis
的实现呢?
答案 0 :(得分:1)
好吧,好吧,我找到了一个解决方案。
我不再在FXML中指定刻度单位;相反,我在代码中执行此操作,我也设置了y轴的最大值(并且autoranging设置为false):
display.yAxis.setUpperBound(maxDepth);
final int tickUnit = maxDepth / 15;
display.yAxis.setTickUnit(Math.max(tickUnit, 1));
当然,那是一种黑客行为,我当然希望它能在API中开始。或许它是,我没有看到它......
答案 1 :(得分:0)
在这里,您可以看到几行来格式化您想要的数字。 (所以太多人要求解释)
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;
public class AxisFormatter extends Application {
final NumberAxis xAxis = new NumberAxis();
final NumberAxis yAxis = new NumberAxis();
final LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis);
double i = 0d;
final StringConverter<Number> converter = new StringConverter<Number>() {
@Override public String toString(Number object) {
//just an untested idea for isInteger
return object.doubleValue() == object.intValue()
? object.intValue()+""
:"";
}
@Override public Number fromString(String string) { return 0;}
};
@Override public void start(Stage primaryStage) {
chart.getData().add(new XYChart.Series<>());
while (i++ < 10d)
chart.getData().get(0).getData().add(new XYChart.Data<>(i,i/2));
Button btn1 = new Button("increase max y value");
btn1.setOnAction((evt)->{
chart.getData().get(0).getData().add(new XYChart.Data<>(i++,i/2));
});
Button btn2 = new Button("change formatter");
btn2.setOnAction((evt)->{
yAxis.setTickLabelFormatter(yAxis.getTickLabelFormatter() == converter
? null : converter);
});
yAxis.setTickLabelFormatter(converter);
VBox root = new VBox(chart, new HBox(5,btn1,btn2));
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}