我正在为JavaFX启动一个小型的高性能图表库,因为提供的图表库仍然存在错误,并且不是为了显示大量的点数(20k +)。
我的自定义图表类正在扩展StackPane
,但这不允许我按照here解释明确定位元素,我遇到了这个问题。所以现在我转移到Pane
但是Pane
似乎不允许z顺序,尽管很多人说z-order是根据子列表中的Node
位置实现的
这是我在扩展StackPane
时所得到的:
这是我使用Pane
代替的时候:
正如您所见,线条不再显示。以下是我添加节点的方法:
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);
}
}
答案 0 :(得分:1)
为什么您的窗格测试不显示任何窗格
自动调整窗格大小以适合其内容。如果它没有内容且没有最小尺寸,那么它根本没有尺寸,所以你不会看到它。如果您为窗格设置了最小尺寸,则可以看到它们,例如:
pane1.setMinSize(200, 200);
pane2.setMinSize(300, 300);
我没有尝试调试自定义XYChart中的代码,以确定为什么你的行没有显示在那里,我的猜测是问题可能与z顺序逻辑无关但可能与其他一些代码有关问题。
一些建议
要完成图表包,您还有很长的路要走。如果内置的JavaFX图表包不符合您的要求,我建议您评估第三方库,例如JFreeChart或OrsonCharts,它们可以通过FXGraphics2D网桥在JavaFX中使用。 / p>