固定JavaFX中X和Y轴的宽度

3
如何在JavaFx折线图中实现固定轴宽度?
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.stage.Stage;

public class Axis extends Application
{

    private Timeline animation;

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

    @Override
    public void start(final Stage stage) throws Exception
    {
        final NumberAxis x = new NumberAxis();
        final NumberAxis y = new NumberAxis();
        x.setAutoRanging(false);
        y.setAutoRanging(false);

        final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(x, y);
        // final Series series = new LineChart.Series<Number, Number>();
        //
        // series.getData().add(new XYChart.Data(20, 23));
        // series.getData().add(new XYChart.Data(35, 14));
        // series.getData().add(new XYChart.Data(43, 15));
        // series.getData().add(new XYChart.Data(60, 24));
        // series.getData().add(new XYChart.Data(10, 34));
        //
        // lineChart.getData().add(series);
        lineChart.setPrefHeight(10);
        lineChart.setPrefWidth(10);
        lineChart.setMinHeight(10);
        lineChart.setMinWidth(10);
        lineChart.setMaxHeight(10);
        lineChart.setMaxWidth(10);

        final Scene scene = new Scene(lineChart, 800, 800);
        stage.setScene(scene);
        stage.show();

    }

    @Override
    public void stop()
    {
        animation.pause();
    }
}

enter image description here

我希望在调整窗口大小时,网格(标记为红色的示例)不会缩放。当前,当窗口调整大小时,网格会缩放,如下所示

enter image description here

使用minWidth和maxWidth API无法实现我的需求。


您的问题是“如何在保持纵横比的情况下调整图形大小?”,还是“如何防止图形任何调整大小?” - jewelsea
如何防止图表的任何调整大小。 - SDS
1个回答

2

防止图表调整大小

您可以通过设置图表的首选、最小和最大尺寸来防止其调整大小:

lineChart.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);
lineChart.setPrefSize(800, 600);
lineChart.setMaxSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);

唯一的例外是当图表是场景的根时,此时您应将图表包装在 Pane 或 Group 中,以防止它由于 JavaFX 8 渲染逻辑中的布局问题而被调整大小。另外请注意,将任何可调整大小的节点放入 Group 中会将该节点(排除变换和效果)调整为其首选尺寸,并且永远不会更改它们。
不幸的是,设置图表的首选大小与直接设置图表轴的首选大小并不完全相同,因为它会使整个图表都达到这个大小,而不是特定的轴线,这可能是您提出问题时想要的内容。
防止图表轴重新调整大小:
我不知道如何做到这一点。
您可能认为可以执行以下操作:
xAxis.setMinWidth(Control.USE_PREF_SIZE);
xAxis.setPrefWidth(800);
xAxis.setMaxWidth(Control.USE_PREF_SIZE);

但是在Java 8中,当轴嵌入到图表中时,这种方法不起作用。这是因为XYChart布局例程在布置图表内容时忽略了轴的首选、最小和最大尺寸。这可能是一个bug,您可以将其记录在https://javafx-jira.kenai.com上。

根据您的建议,我将图表包装在BorderPane()中,并设置了lineChart的MinSize、PrefSize和MaxSize,这样就不会再缩放图表了。public void start(final Stage stage) throws Exception { final NumberAxis x = new NumberAxis(); ... lineChart.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE); lineChart.setPrefSize(800, 800); lineChart.setMaxSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE); final BorderPane border = new BorderPane(); border.setTop(lineChart); final Scene scene = new Scene(border); stage.setScene(scene); stage.show(); } - SDS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接