charts - JavaFX 图表 - CategoryAxis 调整大小问题

标签 charts javafx-8

我有一个用户可调整大小的图表。当图表变小时,CategoryAxis 会旋转,您将无法再看到大多数类别标签。这是一个显示问题的 gif:

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

最佳答案

这个问题不容易修复(IMO)。

这是怎么回事

Java 8u60 的 CategoryAxis 代码在内部维护了一个私有(private)的 effectiveTickLabelRotation成员。由于内部实现,此成员有时可以覆盖您为公开可用的 tickLabelRotationProperty 设置的任何值.所以你对功能并没有太多的控制权。

各种(失败的)尝试使用公共(public) API 修复它

它覆盖的一种方法是将类别轴设置为 autoRanging,因此您可以将 autoRanging 设置为 false,也可以使用 CategoryAxis::setCategory 手动设置类别。方法。这种解决了这个问题,因为当图形变小时不使用有效旋转,它尊重您想要的旋转并且文本保持垂直。

然而,即使关闭自动测距并手动设置类别,实现中仍有其他怪癖妨碍了合理的结果。 CategoryAxis 的内部布局算法仍然认为类别标签已经旋转,因此当图表变小时它没有为标签分配足够的空间。 CategoryAxis 类是最终类,因此布局逻辑不能在子类中被覆盖。快速破解将设置轴的最小宽度,yAxis.setMinWidth(200); .不幸的是,CategoryAxis 布局算法也不尊重最小宽度设置。

获得此功能的选项

简而言之,这一切都被打破了......你要么:

  • 按原样接受默认行为,或
  • log a bug请求修复,或
  • 您将 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);
    

    关于charts - JavaFX 图表 - CategoryAxis 调整大小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32979001/

    相关文章:

    JavaFX 8 : How to be able to re-size window (stage) but keep inner elements at their positions?

    css - 如何在 javaFX FXML 中使用 CSS 设置 SVG 样式

    javascript - 使用 d3 创建折线图出现错误

    ASP.NET 图表控件不再适用于 .NET 4

    JavaFX 2.1 TableView 刷新项

    java - 应用程序启动方法中出现异常 java.lang.reflect.InitationTargetException JavaFX 图像转换

    Javafx: 链接 fx:id-s

    javascript - Highcharts 避免工具提示上出现 "jump effect"和 "shared:true"

    excel - 如何在水平条形图中添加垂直线?

    jquery - 字符串过滤器和控件过滤数据多个谷歌图表