You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ChoiceBox值变更时修改散点图的坐标轴标签?

问题分析与解决

你的代码逻辑里存在一个核心问题:你先创建了chart对象并给ChoiceBox添加了坐标轴标签修改的监听器,但最后往界面中添加的是新创建的另一个ChartViewer实例(调用createChart()生成的新图表),导致之前设置的监听器完全没作用在显示的图表上。

修改后的完整代码

public class ScatterAdd extends Application {
    private final XYSeries series = new XYSeries("Voltage");

    ChoiceBox<String> domainLabels = new ChoiceBox<>();
    ChoiceBox<String> rangeLabels = new ChoiceBox<>();

    private JFreeChart createChart() {
        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series);
        return ChartFactory.createScatterPlot("VI Characteristics", "Current", "Voltage", dataset);
    }

    @Override
    public void start(Stage stage) {
        domainLabels.getItems().addAll("Current", "Seconds");
        domainLabels.setValue("Current");

        rangeLabels.getItems().addAll("Voltage", "Metres");
        rangeLabels.setValue("Voltage");

        // 只创建一次图表实例
        JFreeChart chart = createChart();
        // 给ChoiceBox添加监听器,修改当前图表的坐标轴标签
        domainLabels.getSelectionModel().selectedItemProperty().addListener((ov, s0, s1) -> {
            chart.getXYPlot().getDomainAxis().setLabel(s1);
        });
        rangeLabels.getSelectionModel().selectedItemProperty().addListener((ov, s0, s1) -> {
            chart.getXYPlot().getRangeAxis().setLabel(s1);
        });
        
        var xSpin = new Spinner<Double>(-10000.000, 10000.000, 0);
        xSpin.setEditable(true);
        xSpin.setPromptText("Xvalue");

        var ySpin = new Spinner<Double>(-10000.000, 10000.000, 0);
        ySpin.setEditable(true);
        ySpin.setPromptText("Yvalue");

        var button = new Button("Add");
        button.setOnAction(ae -> series.add(xSpin.getValue(), ySpin.getValue()));

        HBox xBox = new HBox();
        xBox.getChildren().addAll(domainLabels);

        HBox yBox = new HBox();
        yBox.getChildren().addAll(rangeLabels);

        var enter = new ToolBar(xBox, xSpin, yBox, ySpin, button);
        BorderPane.setAlignment(enter, Pos.CENTER);
        
        BorderPane root = new BorderPane();
        // 使用之前创建好的chart实例,而不是重新调用createChart()
        root.setCenter(new ChartViewer(chart));
        root.setBottom(enter);

        stage.setTitle("ScatterAdd");
        stage.setScene(new Scene(root, 640, 480));
        stage.show();

    }

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

关键修改点

  • 复用同一个图表实例:将root.setCenter(new ChartViewer(createChart()))改为root.setCenter(new ChartViewer(chart)),确保界面显示的图表是你添加了监听器的那个实例。
  • 监听器逻辑本身是正确的,只要作用在显示的图表上,就能在ChoiceBox选项变更时实时更新坐标轴标签。

内容的提问来源于stack exchange,提问作者armitageshanks99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:15:39