2

从一定数量的绘制刻度开始,xAxis 上的标签旋转 90 度进入垂直位置。我想让它们保持水平,并且只绘制适合 xAxis 的尽可能多的图。

这显示了它的外观以及我希望它的外观:

示例图像

如果没有足够的空间来旋转看起来的标签,则尝试 xAxis.setTickLabelRotation() 不会显示任何效果。

我做了一个隐藏xAxis标签的工作,在图表下方放置一个HBox并用一些水平的标签填充它。但这不是一个干净的解决方案,并且确实导致了我想避免的其他问题。

这个例子:

展示了如何对 NumberAxis 进行子类化,但我尚未将其转移以实现我的目标。我的想法是对 NumberAxis 进行子类化,覆盖负责在 xAxis 上绘制标签的方法,并使用格式化程序将数字转换为要绘制的日期格式。

那是正确的方法吗?解决方法是什么?我花了很多时间浏览资源但没有成功。任何指向正确方向的提示都将受到高度赞赏。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


public class LineChartSample extends Application {

    @Override
    public void start(Stage stage) {

        final CategoryAxis xAxis = new CategoryAxis();
        final NumberAxis yAxis = new NumberAxis();
        final LineChart<String, Number> lineChart = new LineChart<String, Number>(xAxis, yAxis);
        lineChart.setAnimated(false);
        lineChart.setCreateSymbols(false);
        XYChart.Series series = new XYChart.Series();

        for (int i = 0; i < 100; i+=1)
            series.getData().add(new XYChart.Data(msToDateString(i), Math.random()));


        Scene scene = new Scene(lineChart, 800, 150);
        lineChart.getData().add(series);

        stage.setScene(scene);
        stage.show();
    }

    //msToDateString-----------------------------------------------------------------
    private static DateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS");
    private static Date result = new Date();

    public static String msToDateString(long milliseconds) {
        result.setTime(milliseconds);
        return df.format(result);
    }

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

0 回答 0