如何在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
相关产品推荐
相关产品推荐

