2015-02-08 16 views
4

我從here「偷」一些代碼有「流暢的線條」這是我在我的FXML使用AreaChart和它的作品:即使在軸上自動量程,我也可以保持積分刻度嗎?

<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軸。

我設置tickUnit1.0因爲我想,好吧,積分單位,但它不是做得比較工作:

enter image description here

如果在yAxis的定義,我設置autoRangingfalse然後該圖被裁剪(I設定上通過手結合時我填充圖形):

enter image description here

而且,還有太多的刻度線以及。

基本上,我想雙方的行爲:

  • 的自動量程發生,
  • 但刻度線永遠是不可或缺的數字。

有沒有可能做到這一點,或者我需要自己編碼/找到一個Axis的執行是這樣做的嗎?

+0

也許設置自己的[格式化](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/chart/ValueAxis.html# tickLabelFormatterProperty),只是不打印出不是整數的值。你將有更少的標籤和整數值。除此之外,我認爲你必須自己寫。 – brian 2015-02-08 17:32:18

+0

@布萊恩,我想出了一個黑客。而且,這是一個黑客。但它的作品... – fge 2015-02-08 18:27:58

回答

0

好吧,我找到了一個解決方案。

我沒有在FXML中指定tick單位;而不是我這樣做的代碼,我還設置了Y軸的最大值(和自動量程設置爲false):

display.yAxis.setUpperBound(maxDepth); 
final int tickUnit = maxDepth/15; 
display.yAxis.setTickUnit(Math.max(tickUnit, 1)); 

這是怎樣的一個黑客,當然,我肯定希望它是在開始的API。或者,也許它是,我沒有看到它......

+0

但你失去了自動調整。格式化程序非常簡單。我會添加一個小玩具程序。 – brian 2015-02-08 20:08:28

+0

@brian我可以手動設置最大值,因爲我知道它......好吧,我會試着看看你的解決方案,看看它是怎麼回事。 – fge 2015-02-08 20:13:27

+0

需要考慮的一件事是自動量程很慢。如果你知道最大值,最小值,那麼你可以使用你的解決方案。您可能希望在除以15之前檢查高度。這就是爲什麼自動調整比較慢的原因,它計算每個標籤的大小並檢查它是否合適。它也是一樣的找到打勾單位。 – brian 2015-02-08 20:17:20

0

在這裏,你可以看到只需要幾行來格式化數字,但是你想要的。 (SO霸主要求的解釋)

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

} 
相關問題