2016-11-01 106 views
1

我正在写一个小程序,它创建一个gui来显示csv文件的内容。我试着按照Oracle网站(http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#data)提供的大纲,但是我的问题是用于构建表的'getColumnCount'方法不能访问'headers'变量。或者更可能的是,它可以,但是我认为我在主要方法中所做的更改没有连接到它。如果任何人都可以解释出什么问题以及如何解决问题,那将非常感激。我不确定为什么变量不可访问

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

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

回答

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

是的,这就是它概括地说....你”重新尝试从静态方法更改实例字段,并且也是隐藏要启动的变量,而且这不起作用。理解这个变量在主要方法中声明为本地这个方法 - 只在方法中可见 - 所以对它的更改对类中的头实例字段绝对没有影响。相反,创建一个构造函数,并在需要将其传递到类中时传递标题数据。

一个坏主意是让标头静态 - 只是不要这样做,因为这会抛出OOPs婴儿洗澡的水,基本上用一个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()方法吗?我怀疑一个构造函数会更好,但主要方法一开始对测试很有帮助,而且我尝试构建的构造函数遇到了很多错误。

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

关于“做我弄死我的主要方法” - 但当然你的程序将需要一个主要方法地方,所以你已经知道这个问题的答案。主要的方法应该很小,并且应该仅用于设置应用程序的运动部分,而不再是其他部分。

关于“我怀疑一个构造函数会更好,但主要方法对开始测试很有帮助,而且我尝试构建的构造函数遇到了很多错误。” - 一个构造函数是必要的,主要的方法和构造函数不是相互排斥的,至于错误 - 一次只修复一个。

+0

首先,感谢您的回复!如果我还将实例字段设置为静态,那该怎么办?但假设没有这种简单的选择存在。我不打算使用main()方法吗?我怀疑一个构造函数会更好,但主要方法一开始对测试很有帮助,而且我尝试构建的构造函数遇到了很多错误。 –

+0

@AndréFoote:一个非常糟糕的主意。坚持体面的OOPs结构,不要弯曲这个结构来解决你的代码的根本问题。相反,解决自己的根本问题。请参阅编辑以回答(很快)。 –

+0

请看我在编辑中的问题。 –