如何重新启动NumberAxis并在JavaFX LineChart中移动到下一个值?

时间:2015-04-14 08:09:07

标签: java javafx javafx-2 javafx-8 linechart

我目前正在尝试创建一个图表,它允许我重新启动x轴并继续绘图。轴范围是0-100,但是当图形达到100时,需要以下值再次为0.但是使图表返回到初始零的原因。

在接下来的两张图片中,我将展示如何使用图表。

enter image description here

是什么让图表返回到初始零并继续。 what makes the chart is to be returned to the initial zero.

我需要这样的东西: enter image description here

非常感谢你的帮助!!

1 个答案:

答案 0 :(得分:1)

您可以使用axis.setTickLabelFormatter()格式化刻度标签:

public class TickLabelFormatterDemo extends Application
{

    private static final int RANGE = 100;
    private int last_X_Axis_Val = 20;


    @Override
    public void start( Stage stage )
    {
        stage.setTitle( "Sample" );

        final NumberAxis xAxis = new NumberAxis();
        final NumberAxis yAxis = new NumberAxis();
        xAxis.setForceZeroInRange( false);
        xAxis.setTickLabelFormatter( new StringConverter<Number>()
        {

            @Override
            public String toString( Number object )
            {
                int i = object.intValue() % RANGE;
                return String.valueOf( i == 0 ? RANGE : i );
            }

            @Override
            public Number fromString( String string )
            {
                return null;
            }
        } );

        final LineChart<Number, Number> lineChart
                = new LineChart<>( xAxis, yAxis );

        lineChart.setTitle( "Monitoring" );
        XYChart.Series series = new XYChart.Series();
        series.setName( "Values" );

        Random random = new Random();

        Timeline timeline = new Timeline( new KeyFrame( Duration.seconds( 2 ), new EventHandler<ActionEvent>()
        {
            @Override
            public void handle( ActionEvent event )
            {
                if ( series.getData().size() > 5 )
                {
                    series.getData().remove( 0 );
                }
                series.getData().add( new XYChart.Data( last_X_Axis_Val, random.nextInt( 50 ) ) );
                last_X_Axis_Val += 20;
            }
        } ) );
        timeline.setCycleCount( Timeline.INDEFINITE );
        timeline.play();

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

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


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

}