【问题标题】:I'm not sure why a variable is inaccessible我不确定为什么变量无法访问
【发布时间】:2016-11-01 03:28:51
【问题描述】:

我正在编写一个小程序来创建一个 gui 来显示 csv 文件的内容。我尝试按照 Oracle 网站 (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#data) 的大纲进行操作,但我的问题是用于构建表的 '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
    }
}

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

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

【问题讨论】:

    标签: java swing jtable private tablemodel


    【解决方案1】:
    String[] headers = Arrays.copyOfRange(csvList, 0, 10); //Or maybe this line isn't changing the one above.
    

    是的,简而言之就是这样...。您正在尝试从静态方法更改实例字段,并且还 遮蔽 要引导的变量,但这不起作用.了解 main 方法中 declared 的 headers 变量对于该方法是 local 的——仅在方法中可见——因此对其进行更改绝对不会影响headers 类中的实例字段。而是创建一个构造函数并在需要将标头数据传递给类时将其传递。

    一个坏主意是使标头静态 - 只是不要这样做,因为这会将 OOP 婴儿与洗澡水一起扔掉,本质上是用杂物解决您的问题,而不是对您的程序进行更清洁更根本的改进。

    例如:

    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 方法一开始对测试很有帮助,而且我在尝试构建的构造函数时遇到了很多错误。

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

    关于“我要不要放弃我的 main 方法”——当然,您的程序将需要一个 main 方法某处,所以您已经知道了这个问题的答案。 main 方法应该很小,并且应该只用于设置应用程序的各个部分,仅此而已。

    关于“我怀疑构造函数会更好,但是 main 方法一开始对测试很有帮助,并且我尝试构建的构造函数出现了很多错误。” -- 构造函数是必须的,main方法和构造函数不是相互排斥的,对于错误 -- 修复它们,一次一个。

    【讨论】:

    • 首先,感谢您的回复!如果我也将实例字段设为静态会怎样?但是假设不存在这样简单的选择。我要取消我的 main() 方法吗?我怀疑构造函数会更好,但是 main 方法一开始对测试很有帮助,并且我尝试构建的构造函数出现了很多错误。
    • @AndréFoote:一个非常的坏主意。坚持体面的 OOP 结构,不要为了解决代码的根本问题而扭曲这种结构。而是解决根本问题本身。请查看编辑以回答(很快)。
    • @AndréFoote:查看对答案的更多编辑。请不要在评论中发布这样的代码。如您所见,它无法格式化且无法读取。如果您对代码有重大疑问,请编辑您的原始问题——不要破坏原始问题,并在此处显示代码。
    • 是的,对不起,我第一次尝试,我已经吸取了教训。发布在原始问题中。
    • @AndréFoote:转到主要的 Java 教程:The Really Big Index,您应该开始的主要教程以及 Swing 教程:Using Swing Components,如何创建 Swing GUI。还投资一本像样的 Java 入门书并通读一遍。你不会后悔经历这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2020-06-20
    • 2022-01-08
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多