JavaFX Pane z-order

时间:2014-07-08 23:02:54

标签: javafx-8

我正在为JavaFX启动一个小型的高性能图表库,因为提供的图表库仍然存在错误,并且不是为了显示大量的点数(20k +)。

我的自定义图表类正在扩展StackPane,但这不允许我按照here解释明确定位元素,我遇到了这个问题。所以现在我转移到Pane但是Pane似乎不允许z顺序,尽管很多人说z-order是根据子列表中的Node位置实现的

这是我在扩展StackPane时所得到的:

enter image description here

这是我使用Pane代替的时候:

enter image description here

正如您所见,线条不再显示。以下是我添加节点的方法:

 private Pane chartBackground = new Pane();
    private Pane chartPlotPane = new Pane();
    private XYAxis xAxis = new XYAxis();
    private XYAxis yAxis = new XYAxis();

getChildren().addAll(chartBackground, xAxis, yAxis);

XYAxis只是黑线。如果您需要,这是完整的代码:

public class XYChart<X extends Number,Y extends Number> extends Pane{

    private ArrayList<XYSeries<X,Y>> seriesList = new ArrayList<>();

    // Components
    private Pane chartBackground = new Pane();
    private Pane chartPlotPane = new Pane();
    private XYAxis xAxis = new XYAxis();
    private XYAxis yAxis = new XYAxis();

    // Properties
    private Color BG_COLOR = Color.valueOf("EDEDED");
    private Color PLOT_PANE_COLOR = Color.RED;
    private double yPadding = 20, xPadding = 20;

    public XYChart(){
        getChildren().addAll(chartBackground, xAxis, yAxis);

        chartBackground.setStyle("-fx-background-color:" + BG_COLOR.toString().substring(2) + ";");
        chartPlotPane.setStyle("-fx-background-color:" + PLOT_PANE_COLOR.toString().substring(2) + ";");
        chartPlotPane.setMouseTransparent(true);

        setOnMouseDragged(event -> {
            chartPlotPane.setLayoutX(event.getSceneX());
            chartPlotPane.setLayoutY(event.getSceneY());

            System.out.println("Drag x: " + event.getX());
        });

        redraw();
    }

    public void addSeries(XYSeries<X,Y> series){
        seriesList.add(series);
    }

    public void removeSeries(int index){
        seriesList.remove(index);
    }

    private void drawAxes(){
        xAxis.setAxisWidth(getPrefWidth() - 2*xPadding);
        xAxis.setAxisHeight(10);

        yAxis.setAxisWidth(10);
        yAxis.setAxisHeight(getPrefHeight() - 2*yPadding);

        // Set X axis position
        xAxis.setAxisX(getLayoutX() + yAxis.getAxisWidth() + xPadding);
        xAxis.setAxisY(getLayoutY() + yAxis.getAxisHeight() + yPadding);

        // Set Y axis position
        yAxis.setAxisY(xAxis.getAxisY());
        yAxis.setAxisX(xAxis.getAxisX());

        xAxis.redraw();
        yAxis.redraw();
    }

    public void redraw(){
        drawAxes();

        // Chart background
        chartBackground.setPrefWidth(getPrefWidth());
        chartBackground.setPrefHeight(getPrefHeight());
        chartBackground.setLayoutX(getLayoutX());
        chartBackground.setLayoutY(getLayoutY());

        /*
        // Chart plotting pane
        chartPlotPane.setLayoutX(xAxis.getAxisX());
        chartPlotPane.setLayoutY(yAxis.getAxisY() - yAxis.getAxisHeight());

        chartPlotPane.setPrefWidth(xAxis.getAxisWidth());
        chartPlotPane.setMaxWidth(xAxis.getAxisWidth());*/

        chartPlotPane.setPrefHeight(yAxis.getAxisHeight());
        chartPlotPane.setMaxHeight(yAxis.getAxisHeight());
    }

}

修改

这是一个简单的代码片段,试图做我解释的内容:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class PaneTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        Pane bgPane = new Pane();
        Pane pane1 = new Pane();
        Pane pane2 = new Pane();

        bgPane.setStyle("-fx-background-color: white;");
        pane1.setStyle("-fx-background-color: red;");
        pane2.setStyle("-fx-background-color: blue;");

        pane1.setLayoutX(0);
        pane1.setLayoutY(0);
        pane2.setLayoutX(100);
        pane2.setLayoutY(100);

        bgPane.getChildren().addAll(pane1, pane2);

        Scene scene = new Scene(bgPane, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

1 个答案:

答案 0 :(得分:1)

为什么您的窗格测试不显示任何窗格

自动调整窗格大小以适合其内容。如果它没有内容且没有最小尺寸,那么它根本没有尺寸,所以你不会看到它。如果您为窗格设置了最小尺寸,则可以看到它们,例如:

pane1.setMinSize(200, 200);
pane2.setMinSize(300, 300);

我没有尝试调试自定义XYChart中的代码,以确定为什么你的行没有显示在那里,我的猜测是问题可能与z顺序逻辑无关但可能与其他一些代码有关问题。

一些建议

要完成图表包,您还有很长的路要走。如果内置的JavaFX图表包不符合您的要求,我建议您评估第三方库,例如JFreeChartOrsonCharts,它们可以通过FXGraphics2D网桥在JavaFX中使用。 / p>