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

Java基于JFreeChart实现散点图时输入值跨方法调用问题求助

解决JavaFX TextField变量跨方法访问问题(结合JFreeChart散点图)

问题原因

你当前的代码里,Xbox1、Xbox2这些TextField是start()方法里的局部变量,只能在该方法内部使用;而且createChart()是静态方法,既访问不到局部变量,也没法直接调用非静态的类成员。

解决方案

把需要跨方法访问的TextField声明为类成员变量,同时调整createChart()的修饰符,再处理输入数值的转换和异常,具体修改后的代码如下:

package Grava;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.fx.ChartViewer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import java.io.IOException;

public class Main extends Application { // 修正原代码继承的错误,改为继承Application
    static Stage window;
    Button button;
    Button exitButton;
    Button button1;
    // 将需要跨方法访问的TextField声明为类成员变量
    TextField passInput;
    TextField Xbox1;
    TextField Xbox2;

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

    @Override
    public void start(Stage primaryStage) {
        window = primaryStage;
        window.setTitle("Grava");
        Image image = new Image("Grava.logo.png");
        window.getIcons().add(image);

        String arr[] = {"Voltage", "Current", ""};
        ChoiceBox dropDown = new ChoiceBox(FXCollections.observableArrayList(arr));
        GridPane grid = new GridPane();
        grid.setPadding(new Insets(10, 10, 10, 100));
        grid.setVgap(8);

        passInput = new TextField();
        passInput.setPromptText("password");
        GridPane.setConstraints(passInput, 1, 0);

        Xbox1 = new TextField();
        Xbox1.setPromptText("X值1"); // 修正原代码的promptText赋值错误
        GridPane.setConstraints(Xbox1, 5, 0);

        Xbox2 = new TextField();
        Xbox2.setPromptText("Y值1");
        GridPane.setConstraints(Xbox2, 10, 0);

        button = new Button("click me");
        GridPane.setConstraints(button, 1, 2);
        button.setOnAction(e -> System.out.println(passInput.getText()));

        button1 = new Button("click me for graph");
        GridPane.setConstraints(button1,100,50);
        button1.setOnAction(e->{
            ChartViewer viewer = new ChartViewer(createChart());
            window.setScene(new Scene(viewer));
            window.setTitle("VI Characteristics graph");
            window.setWidth(600);
            window.setHeight(400);
            window.show();
        });

        exitButton = new Button("Exit button");
        GridPane.setConstraints(exitButton, 10, 10);
        exitButton.setOnAction(e -> closeProgram());

        grid.getChildren().addAll(passInput,Xbox1,Xbox2, button,button1, exitButton, dropDown);
        Scene scene = new Scene(grid, 300, 200);
        window.setScene(scene);
        window.show();
    }

    // 移除static修饰,改为实例方法,可直接访问类成员变量
    public JFreeChart createChart() {
        XYSeriesCollection dataset = new XYSeriesCollection();
        XYSeries series1 = new XYSeries("Voltage");

        // 读取TextField输入,添加异常处理避免非数字输入崩溃
        try {
            double x1 = Double.parseDouble(Xbox1.getText());
            double y1 = Double.parseDouble(Xbox2.getText());
            series1.add(x1, y1);
        } catch (NumberFormatException ex) {
            // 输入无效时添加默认值并提示
            series1.add(0, 0);
            System.out.println("输入无效,请输入数字");
        }

        // 保留原有示例数据,可扩展为读取多组输入
        series1.add(10, 35);
        series1.add(11, 37);
        series1.add(12, 41);
        series1.add(12, 39);
        series1.add(13, 44);
        series1.add(14, 51);
        series1.add(15, 52);
        series1.add(15, 54);
        series1.add(16, 57);
        series1.add(17, 62);
        series1.add(17, 66);
        series1.add(18, 70);

        dataset.addSeries(series1);

        return ChartFactory.createScatterPlot(
                "VI Characteristics graph",
                "Voltage",
                "Current",
                dataset
        );
    }

    private static void closeProgram(){
        System.out.println("File saved");
        window.close();
    }
}

关键修改点说明

  1. 类成员变量声明:把passInput、Xbox1、Xbox2移到start()方法外作为类成员,让整个类的实例方法都能访问它们。
  2. 移除static修饰:createChart()去掉static改为实例方法,解决静态方法无法访问非静态成员的问题。
  3. 修正输入提示错误:原代码中Xbox1、Xbox2的提示文本错误复用了passInput的设置,现在改为对应功能的提示。
  4. 输入异常处理:用try-catch捕获数字转换异常,避免用户输入非数字导致程序崩溃。
  5. 简化事件逻辑:移除原代码中冗余的AWT按钮和无效布局代码,直接切换到图表场景。

内容的提问来源于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 06:00:58