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

时间:2016-11-01 03:28:52

标签: java swing jtable private tablemodel

我正在编写一个小程序,它创建一个gui来显示csv文件的内容。我尝试过关注Oracle网站上的大纲(http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#data),但我的问题是' getColumnCount'用于构建表的方法无法访问'标题'变量。或者更可能的是,它可以,但我认为我在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
    }
}

@Hovercraft充满鳗鱼

哦,我应该提到。我是这样实现这个类的,也就是说,我是从其他地方调用它的。

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());
}

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

1 个答案:

答案 0 :(得分:4)

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

是的,简而言之......你正在尝试从静态方法中更改实例字段,并且阴影要引导的变量,这只是不起作用。理解main方法中的头部变量声明 local 到这个方法 - 只在方法中可见 - 因此对它的更改对于它绝对没有影响类中的标题实例字段。而是创建一个构造函数,并在需要将其传递给类时传入标题数据。

一个不好的想法是使标头静止 - 只是不要这样做,因为这会抛出OOP宝宝的洗澡水,基本上用kludge解决你的问题,而不是为你的程序做一个更清洁,更根本的改进。

例如:

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。否则,你的模型将错过大部分必要的机器来使其工作。

关于:

  

如果我将实例字段设为静态怎么办?但假设没有这样简单的选择。我取消了main()方法吗?我怀疑构造函数会更好,但主要方法最初对测试有帮助,而且我试图构建的构造函数出现了很多错误。

再次,避免静态,因为这会增加代码的连通性,它的“耦合”没有好处,这大大增加了随着程序的增长难以发现错误的风险。

关于“我是否取消了我的主要方法” - 但当然你的程序需要一个主方法某处,所以你已经知道答案了。主要方法应该很小,并且应该仅用于设置应用程序的运动部分,仅此而已。

关于“我怀疑构造函数会更好,但主要方法最初对测试有帮助,而且我试图构建的构造函数出现了很多错误。” - 构造函数是必要的,main方法和构造函数不是互斥的,对于错误 - 一次修复一个。