有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何为另一个类中使用的ArrayList对象创建别名

所以我有3个不同的类,一个:创建状态对象,二个:从csv文件读取数据并将数据传递给状态构造函数,以便创建状态对象的ArrayList,三个:在GUI中显示此信息

两个人的代码如下:

public class DataReader
{
   private ArrayList<State> states  = new ArrayList<State>();
   private File file = new File("data_11_09.csv"); 

public ArrayList<State> readData() throws FileNotFoundException {
       Scanner read = new Scanner(file);
       read.useDelimiter(",");
       
       String stateName;
       int infectionNum;
       int deathNum;
       
       while (read.hasNextLine()) {
           stateName = read.nextLine();
           infectionNum = read.nextInt();
           deathNum = read.nextInt();
           states.add(new State(stateName, infectionNum, deathNum));
    }
        read.close();
    
        return states;
    }
}

然后是第三类的代码:

public class ChartWindow extends Application
{
    ArrayList<State> displayStates = new ArrayList<State>();
    final double RADIUS = 2000;
    int horSpace;
    int verSpace;
   
    @Override
    public void start(Stage primaryStage) {
        
   
    }
    
    public State drawState() {
        collections.copy(displayStates, states);
    }
}

但是,在drawState()方法下,我得到一个错误,即找不到变量“states”。我不知道如何从第二类到第三类引用states ArrayList。任何帮助都将不胜感激。。。对不起,如果这是长篇大论,但我是新来的


共 (1) 个答案

  1. # 1 楼答案

    您可以尝试以下方法:

    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.scene.Scene;
    import javafx.scene.control.ListView;
    import javafx.stage.Stage;
    
    public class ChartWindow extends Application {
        @Override
        public void start(Stage stage) {
            DataReader reader = new DataReader();
    
            ListView<State> stateListView = new ListView<>(
                FXCollections.observableArrayList(
                    reader.readData()
                )
            );
    
            stage.setScene(new Scene(stateListView));
        }
    }
    

    要点:

    1. 不需要使用drawState()方法,如果要更新场景控件的可观察属性,JavaFX将automatically draw things when they are in the scene并更新它们
    2. JavaFX应用程序是执行的入口点,因此您需要让它创建它需要运行的东西(例如,应用程序创建DataReader,而不是相反)
    3. 因为JavaFX应用程序正在创建数据读取器,所以它将自动拥有对它的引用,所以您不需要到处传递对数据读取器的引用
    4. 您可以使用TableView而不是ListView,我只是使用ListView,因为它需要更少的代码
    5. 为了让ListView以有意义的方式显示项目,您可以向State对象(或ListView上的implement a cell factory)添加一个toString方法
    6. 对于您的实际应用程序,您可能会有不同的需求,我只是提供了上面的代码,以帮助您更好地开始工作

    其他一些评论是正确的,为了在这方面取得成功,您可能需要花费大量的时间和精力学习一些基本的编程教程(例如"Trails Covering the Basics"