我不确定为什么无法访问变量

I'm not sure why a variable is inaccessible

我正在编写一个小程序来创建一个 gui 来显示 csv 文件的内容。我已经尝试按照 Oracle 网站 (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#data) 的大纲进行操作,但我的问题是用于构建 table 的 'getColumnCount' 方法无法访问 'headers' 变量。或者更有可能,它可以,但我认为我在 main 方法中对它所做的更改没有连接到它。如果有人能阐明问题所在以及如何解决它,我们将不胜感激。

public class MyTableModel implements TableModel {

    private String[] headers;        //This line.
    private Object[][] tableData;

    public static void main(String[] args) {
        String fileName = "products.csv";

        String[] csvList = readCSV(fileName);

        String[] headers = Arrays.copyOfRange(csvList, 0, 10); //Or maybe this line isn't changing the one above.
    }

    private static String[] readCSV(String file) {
        //Some code to fill the list.
        return fileString;
    }

    @Override
    public int getColumnCount() {
        return headers.length;        //<<This line of code
    }
}

@装满鳗鱼的气垫船

哦,我应该提一下。我是这样实现这个class的,也就是说,我是从别处调用它的。

private static void createGUI() {
    csvTabler table = new csvTabler();
    table.setTitle("CSV Table");
    table.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    table.createJTable();
    table.pack();
    table.setVisible(true);
}

private void createJTable() {
    jTable = new JTable(new MyTableModel());
}

我确定这会影响您的解决方案,但我不确定如何调整..

String[] headers = Arrays.copyOfRange(csvList, 0, 10); //Or maybe this line isn't changing the one above.

是的,简而言之....您正在尝试从静态方法更改实例字段并且还遮蔽要启动的变量,并且只是行不通。了解 main 方法中的 headers 变量 declared 是此方法的 local -- 仅在方法内可见 -- 并且因此对它的更改对 class 中的 headers 实例字段绝对没有影响。相反,创建一个构造函数并在需要将数据传递到 class 时传递 header 数据。

一个坏主意是让 headers 静态化——只是不要这样做,因为这会把 OOPs 婴儿连同洗澡水一起扔掉,本质上是解决你的问题而不是让一个更清洁对您的程序进行更根本的改进。

例如:

public class MyTableModel implements TableModel {

    private String[] headers;        //This line.
    private Object[][] tableData;


    public MyTableModel(String[] headers, Object[][] tableData) {
        this.headers = headers;
        this.tableData = tableData;
    }

    @Override
    public int getColumnCount() {
        return headers.length;        //<<This line of code
    }

    public static void main(String[] args) {
        String fileName = "products.csv";

        String[] csvList = readCSV(fileName);

        String[] headers = Arrays.copyOfRange(csvList, 0, 10); 
        Object[][] tableData = ..MyTableModel.. // code to create this

        // now create a table model with your data and use it.
        MyTableModel myTableModel = new MyTableModel(headers, tableData);
    }

    private static String[] readCSV(String file) {
        String fileString = "";
        //Some code to fill the list.
        return fileString;
    }

}

其他问题:您几乎不应该实现 TableModel,而应该扩展 DefaultTableModel 或 AbstractTableModel。否则您的模型将缺少使其工作所需的大部分机制。

关于:

What if I made the instance field static as well? But assuming that no such easy option exists. Do I do away with my main() method? I suspected that a constructor would be better, but the main method was helpful for testing at first, and I was getting a lot of errors with the constructor I tried to build.

同样,避免静态,因为这会增加代码的连通性,它 "coupling" 没有好处,随着程序的增长,这会大大增加难以发现错误的风险。

关于,"do I do away with my main method"——当然你的程序需要一个主方法某处,所以你已经知道了这个问题的答案。 main 方法应该很小,并且应该只用于启动应用程序的各个部分,仅此而已。

关于 "I suspected that a constructor would be better, but the main method was helpful for testing at first, and I was getting a lot of errors with the constructor I tried to build." -- 构造函数是必需的,main 方法和构造函数不是相互排斥的,至于错误 -- 一次修复它们。