- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两个图表绘制在同一个堆栈 Pane 上。
它们有共同的 x 轴和 y 轴,我想让它们可滚动。
这是我编码的内容:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
/**
* Demonstrates how to draw layers of XYCharts.
* https://forums.oracle.com/forums/thread.jspa?threadID=2435995 "Using StackPane to layer more different type charts"
*/
public class LayeredXyChartsSample extends Application {
private XYChart.Series<Number, Number> lineSeries1;
private XYChart.Series<Number, Number> lineSeries2;
private NumberAxis xAxis;
private NumberAxis yAxis;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
initSeries();
// Close the application when the window is closed
stage.setOnCloseRequest(t -> {
Platform.exit();
System.exit(0);
});
stage.setScene(
new Scene(
layerCharts(
createLineChart1(),
createLineChart2()
)
)
);
stage.show();
}
@SuppressWarnings("unchecked")
private void initSeries() {
lineSeries1 = new XYChart.Series(
FXCollections.observableArrayList(
new XYChart.Data(1, 2),
new XYChart.Data(2, 10),
new XYChart.Data(3, 8),
new XYChart.Data(4, 4),
new XYChart.Data(5, 7),
new XYChart.Data(6, 5),
new XYChart.Data(7, 4),
new XYChart.Data(8, 8),
new XYChart.Data(9, 16.5),
new XYChart.Data(10, 13.9),
new XYChart.Data(11, 17),
new XYChart.Data(12, 10)
)
);
lineSeries2 = new XYChart.Series(
FXCollections.observableArrayList(
new XYChart.Data(1, 1),
new XYChart.Data(2, 2),
new XYChart.Data(3, 1.5),
new XYChart.Data(4, 3),
new XYChart.Data(5, 2.5),
new XYChart.Data(6, 5),
new XYChart.Data(7, 4),
new XYChart.Data(8, 8),
new XYChart.Data(9, 6.5),
new XYChart.Data(10, 13),
new XYChart.Data(11, 10),
new XYChart.Data(12, 20)
)
);
createXaxis();
createYaxis();
}
private void createYaxis() {
yAxis = new NumberAxis();
yAxis.setAutoRanging(false);
yAxis.setPrefWidth(35);
yAxis.setMinorTickCount(10);
yAxis.setLowerBound(0);
yAxis.setUpperBound(20);
}
private void createXaxis() {
xAxis = new NumberAxis();
xAxis.setAutoRanging(false);
xAxis.setLowerBound(-10);
xAxis.setUpperBound(22);
}
@SuppressWarnings("unchecked")
private LineChart<Number, Number> createLineChart1() {
final LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis);
setDefaultChartProperties(chart);
chart.setCreateSymbols(false);
chart.getData().addAll(lineSeries1);
return chart;
}
@SuppressWarnings("unchecked")
private LineChart<Number, Number> createLineChart2() {
final LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis);
setDefaultChartProperties(chart);
chart.setCreateSymbols(false);
chart.getData().addAll(lineSeries2);
return chart;
}
private void setDefaultChartProperties(final XYChart<Number, Number> chart) {
chart.setLegendVisible(false);
chart.setAnimated(false);
}
@SafeVarargs
private final StackPane layerCharts(final XYChart<Number, Number>... charts) {
for (int i = 1; i < charts.length; i++) {
configureOverlayChart(charts[i]);
}
StackPane stackpane = new StackPane();
stackpane.getChildren().addAll(charts);
stackpane.setOnScroll(event -> {
double deltaX = event.getDeltaX();
if (deltaX != 0) {
xAxis.setUpperBound(xAxis.getUpperBound() + deltaX / 10);
xAxis.setLowerBound(xAxis.getLowerBound() + deltaX / 10);
}
});
return stackpane;
}
private void configureOverlayChart(final XYChart<Number, Number> chart) {
chart.setAlternativeRowFillVisible(false);
chart.setAlternativeColumnFillVisible(false);
chart.setHorizontalGridLinesVisible(false);
chart.setVerticalGridLinesVisible(false);
chart.getXAxis().setVisible(false);
chart.getYAxis().setVisible(false);
chart.getStylesheets().addAll(getClass().getResource("/overlay-chart.css").toExternalForm());
}
}
当我用侧面的触控板滚动时,两个图表中只有一个被刷新...
怎么会呢?我也希望更新第二个图表,但我在 XYChart 类中找不到可以调用来强制刷新的方法。所有似乎执行此操作的方法都是私有(private)的...
编辑: 我没有在堆栈 Pane 上设置 onScroll 监听器,而是尝试在两个图表上设置它。但似乎只有顶部布局收到通知...所以我有相同的结果:只有一个图表翻译...
编辑2:我知道在这个例子中我可以只创建一个包含两个系列的图表,而不是堆叠它们,这样就可以了。但实际上,我使用的堆叠图表是不同类型的(折线图和自定义图表),因此我确实需要将它们堆叠在堆栈 Pane 中。
最佳答案
正如 @James_D 所建议的(顺便说一句,非常感谢),解决方案是使用多个 x 轴并分别更新每个轴:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import java.util.ArrayList;
import java.util.List;
/**
* Demonstrates how to draw layers of XYCharts.
* https://forums.oracle.com/forums/thread.jspa?threadID=2435995 "Using StackPane to layer more different type charts"
*/
public class LayeredXyChartsSample extends Application {
private XYChart.Series<Number, Number> lineSeries1;
private XYChart.Series<Number, Number> lineSeries2;
private List<NumberAxis> xAxes = new ArrayList<>();
private NumberAxis yAxis;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
initSeries();
// Close the application when the window is closed
stage.setOnCloseRequest(t -> {
Platform.exit();
System.exit(0);
});
stage.setScene(
new Scene(
layerCharts(
createLineChart1(),
createLineChart2()
)
)
);
stage.show();
}
@SuppressWarnings("unchecked")
private void initSeries() {
lineSeries1 = new XYChart.Series(
FXCollections.observableArrayList(
new XYChart.Data(1, 2),
new XYChart.Data(2, 10),
new XYChart.Data(3, 8),
new XYChart.Data(4, 4),
new XYChart.Data(5, 7),
new XYChart.Data(6, 5),
new XYChart.Data(7, 4),
new XYChart.Data(8, 8),
new XYChart.Data(9, 16.5),
new XYChart.Data(10, 13.9),
new XYChart.Data(11, 17),
new XYChart.Data(12, 10)
)
);
lineSeries2 = new XYChart.Series(
FXCollections.observableArrayList(
new XYChart.Data(1, 1),
new XYChart.Data(2, 2),
new XYChart.Data(3, 1.5),
new XYChart.Data(4, 3),
new XYChart.Data(5, 2.5),
new XYChart.Data(6, 5),
new XYChart.Data(7, 4),
new XYChart.Data(8, 8),
new XYChart.Data(9, 6.5),
new XYChart.Data(10, 13),
new XYChart.Data(11, 10),
new XYChart.Data(12, 20)
)
);
createYaxis();
}
private void createYaxis() {
yAxis = new NumberAxis();
yAxis.setAutoRanging(false);
yAxis.setPrefWidth(35);
yAxis.setMinorTickCount(10);
yAxis.setLowerBound(0);
yAxis.setUpperBound(20);
}
private NumberAxis createXaxis() {
NumberAxis xAxis = new NumberAxis();
xAxis.setAutoRanging(false);
xAxis.setLowerBound(-10);
xAxis.setUpperBound(22);
xAxes.add(xAxis);
return xAxis;
}
@SuppressWarnings("unchecked")
private LineChart<Number, Number> createLineChart1() {
final LineChart<Number, Number> chart = new LineChart<>(createXaxis(), yAxis);
setDefaultChartProperties(chart);
chart.setCreateSymbols(false);
chart.getData().addAll(lineSeries1);
return chart;
}
@SuppressWarnings("unchecked")
private LineChart<Number, Number> createLineChart2() {
final LineChart<Number, Number> chart = new LineChart<>(createXaxis(), yAxis);
setDefaultChartProperties(chart);
chart.setCreateSymbols(false);
chart.getData().addAll(lineSeries2);
return chart;
}
private void setDefaultChartProperties(final XYChart<Number, Number> chart) {
chart.setLegendVisible(false);
chart.setAnimated(false);
}
@SafeVarargs
private final StackPane layerCharts(final XYChart<Number, Number>... charts) {
for (int i = 1; i < charts.length; i++) {
configureOverlayChart(charts[i]);
}
StackPane stackpane = new StackPane();
stackpane.getChildren().addAll(charts);
stackpane.setOnScroll(event -> {
double deltaX = event.getDeltaX();
if (deltaX != 0) {
for (NumberAxis xAxis : xAxes) {
xAxis.setUpperBound(xAxis.getUpperBound() - deltaX / 10);
xAxis.setLowerBound(xAxis.getLowerBound() - deltaX / 10);
}
}
});
return stackpane;
}
private void configureOverlayChart(final XYChart<Number, Number> chart) {
chart.setAlternativeRowFillVisible(false);
chart.setAlternativeColumnFillVisible(false);
chart.setHorizontalGridLinesVisible(false);
chart.setVerticalGridLinesVisible(false);
chart.getXAxis().setVisible(false);
chart.getYAxis().setVisible(false);
chart.getStylesheets().addAll(getClass().getResource("/overlay-chart.css").toExternalForm());
}
}
关于java - 如何强制 XYChart 刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49661524/
是否可以制作隐藏轴的 XYChart?理想情况下删除。 从源代码来看,它似乎必须有一个,因为 XYChart 在调用 layoutChartChildren() 时不会检查 null Axis,这是一
现在我正在使用 JavaFX 图表,但我需要为每种图表类型创建一个通用类。例如,我需要创建一个 ScatterChart,我可以从此类创建一个带有 X = 数字和 Y= 数字轴、X = 字符串和 Y
您好,我已将数据添加到 XYSeries 中,并尝试将数据从最短长度到最大长度排序。我不知道如何操作这些数据,任何人都可以帮助我。这是我的代码: xLabel = "Link I
从这个问题开始JavaFX LineChart Hover Values我在第一个答案中修改了 Gist https://gist.github.com/jewelsea/4681797进入这个 pu
我正在尝试设置我的 JavaFX 面积图的样式,但找不到任何方法来为特定系列设置颜色。我知道,我可以通过 CSS 设置样式,但我也想在代码中这样做。 我该怎么做?1.) 如何使用内联样式为 Area-
我有两个图表绘制在同一个堆栈 Pane 上。 它们有共同的 x 轴和 y 轴,我想让它们可滚动。 这是我编码的内容: import javafx.application.Application; im
所以我想生成随机的JavaFX XYcharts,例如散点图。我使用的是netbeans 7.4。 我想随机化输入的数据,并且我也想随机化系列的数量。我已经添加了随机数据,但我不知道如何随机化所使用的
我在线性布局中使用 AChartEngine 绘制图表。我有图表的边距 mRenderer.setMargins(new int[] {20, 50, 20, 20}); 问题是当我缩放图
大家好,我遇到了这个问题: XYChart.Series x = (XYChart.Series)((XYChart.Series)item).clone(); 错误:clone() 已在 java.
我正在尝试在 JavaFX 中使用 XYChart 在 X 轴上显示日期。 @FXML private LineChart grafico; @FXML private NumberAxis eixo
我试图在计时器方法中强制更新自定义 XYChart,但似乎唯一有效的方法是调整窗口大小。 import javafx.application.Application; import javafx.ap
我在更新图表时遇到一些问题 我有类(class)图表 public class Chart { public LineChart createChart() { // defi
我一直在尝试使用 XYCharts 做一些工作,特别是在它们上面或周围放置东西。我一直需要使用与整个图表定义的坐标空间相关的轴边界框的坐标。但是,我意识到 .getBoundsInParent() 方
我有一个 XYChart 将数据绘制为 Y 轴上的线性步长,我想绘制为对数或半对数 Y 刻度,如何更改我的以下代码? public class BaseXYChart extends Applicat
我试图用 javascript 更新我的 am4charts.XYChart 的数据,但我不能 我尝试再次执行 am4core.create("chartdiv", am4charts.XYChart
我想要一个交互式折线图,允许我移动和设置图表上点的基础值。将鼠标事件 ondragged 处理程序添加到 XYChart.Data 点的节点应该允许我这样做,但我需要能够将鼠标事件位置转换为该点的轴参
大家好,我正在使用 am4charts.XYChart 来显示两个不同 vendor 的价格 图形工作正常,只有当我们将光标悬停在图形中的点上时,每个点的工具提示才可见,但是我的要求是图形中所有点的工
我尝试获取 XYChart.Data 的节点,但它为空。 var a = new XYChart.Data(10, 10); if(a.getNode()==null){ System.out.pri
我在 XYChart 绘图时遇到了缩放问题:我的数据系列的浮点值范围为 0.4 和 0.5,当在场景上绘图时,我得到的最小 Y 值是 1,所以我看不到任何绘图。 如果我使用具有更高值(例如 > 100
我有这个代码来对 XYChart LineChart 执行缩放 public class Zoom extends Application { BorderPane pane; Rectangle
我是一名优秀的程序员,十分优秀!