我正在编写一个小程序,它创建一个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());
}
我确定这会影响您的解决方案,但我不确定如何调整..
答案 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方法和构造函数不是互斥的,对于错误 - 一次修复一个。