2015-10-06 37 views
4

我有一個用戶可調整大小的圖表。當圖表變小時,CategoryAxis會旋轉,並且您無法再看到大部分類別標籤。下面是一個GIF圖片,展示問題:JavaFX圖表 - 類別代碼調整問題

Example of Issue

有沒有辦法停止轉動的標籤?

我知道我可以添加一個偵聽器到旋轉屬性,如果旋轉改變,將它旋轉回0。但是,當我這樣做時,它不會阻止間距調整,因此標籤會被切斷(您只能看到標籤的最後幾個字符)。

這裏是所包含的GIF的代碼,你會看到問題,因爲你改變窗口大小:

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

public class HorizontalBarExample extends Application { 
    @Override 
    public void start(Stage stage) { 
     NumberAxis xAxis = new NumberAxis(); 
     CategoryAxis yAxis = new CategoryAxis(); 
     BarChart<Number, String> bc = new BarChart<Number, String>(xAxis, yAxis); 
     bc.setBarGap(0d); 
     bc.setCategoryGap(0); 

     xAxis.setTickLabelRotation(90); 
     yAxis.tickLabelRotationProperty().set(0d); 

     XYChart.Series<Number, String> series1 = new XYChart.Series<>(); 
     series1.setName("example"); 

     for (int i = 0; i < 10; i++) 
      series1.getData().add(new XYChart.Data<Number, String>(Math.random() * 5000, "long data label number" + i)); 

     bc.getData().add(series1); 

     Scene scene = new Scene(bc, 800, 600); 
     stage.setScene(scene); 
     stage.show(); 
    } 

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

我會說,這是一個錯誤:如果空間變小,以水平顯示的所有標籤的任何類別軸應該做的,旋轉的還不是可行的選擇(離開每第n個可能一個 - 或沒有 - 或沒有顯示,直到鼠標懸停在該類別上,然後只顯示那一個) – kleopatra

回答

4

這個問題是不會輕易可以解決的(IMO)。

這是怎麼回事

的Java 8u60則CategoryAxis代碼內部維護的私人effectiveTickLabelRotation成員。由於內部實現,此成員有時可以覆蓋您爲公開可用的tickLabelRotationProperty設置的任何值。所以你對功能沒有太多的控制。

各種(失敗)嘗試使用公共API來解決它,它會覆蓋是當分類軸被設置爲自動量程,以便可以設置自動量程爲false和手動設置的類別

單程使用CategoryAxis::setCategory方法。這種修復問題是因爲當圖形變小時不使用effectiveRotation,它尊重你想要的旋轉和文本保持垂直。

但是,即使切換自動測距關閉和手動設置類別,實施中還存在其他一些不合理的結果。 CategoryAxis的內部佈局算法仍認爲類別標籤已旋轉,因此當圖表變小時,它不會爲標籤分配足夠的空間。 CategoryAxis類是final的,所以佈局邏輯不能在子類中重寫。快速入侵將被設置爲軸的最小寬度,yAxis.setMinWidth(200);。不幸的是,CategoryAxis佈局算法並不考慮最小寬度設置。

選項來獲得這個功能

總之,它是所有類型的破碎......您:

  1. 接受默認行爲是,OR
  2. log a bug請求修復,或
  3. 您將CategoryAxis代碼複製到一個新的類,例如Horizo​​ntallyLabelledCategoryAxis,進行一些修改以允許佈局算法按您的意願工作,並使用該新類代替原始的CategoryAxis。

選項3有點棘手,但可行。

建議的工作,各地

所有這一切說,我建議你,如果是你的UI可以接受的方法(如變通),簡直是不要讓圖表獲得足夠小它的佈局擰緊了。

VBox chartHolder = new VBox(bc); 
VBox.setVgrow(bc, Priority.ALWAYS); 
bc.setMinHeight(300); 
Scene scene = new Scene(chartHolder, 800, 600);