2016-11-01 12 views
1

私はcsvファイルの内容を表示するGUIを作成する小さなプログラムを書いています。私は、Oracle Webサイト(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. 

うん、私は、これはあなたのソリューションに影響を与えます確信しているが、私は調整するかどうかはわかりません」インスタンスフィールドを静的メソッドから変更しようとしています。また、シャドウイングの変数を起動するだけで動作しません。変数がメインメソッド内のがこのメソッドにはローカルであると宣言されていることを理解してください。メソッド内でのみ表示されるため、変更はクラスのヘッダインスタンスフィールドにはまったく影響しません。代わりに、コンストラクタを作成し、クラスに渡す必要があるときにヘッダデータを渡します。

ヘッダーを静的にすることは悪い考えです。これは、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()メソッドを削除しますか?私はコンストラクタがうまくいくと思っていましたが、主な方法は最初はテストに役立ちました。ビルドしようとしたコンストラクタで多くのエラーが発生しました。

これはあなたのコード、大幅にあなたのプログラムが大きくなるにつれてバグを見つけるのは難しいのあなたのリスクを増大させることなく、利益の「カップリング」のつながりを向上させるよう再度、静を避けます。

「私の主な方法はやめますか?」というのはもちろんですが、あなたのプログラムにはメインメソッドどこかにが必要です。主な方法は小さくなければならず、動いているアプリケーションの部分だけを設定するために役立つはずです。

「コンストラクタがうまくいくと思っていましたが、メインメソッドは最初はテストに役立ちました。ビルドしようとしたコンストラクタでは多くのエラーが発生していました。 - コンストラクタが必要です。メインメソッドとコンストラクタは相互排他的ではなく、エラーについては一度に1つずつ修正してください。

+0

まず、お返事いただきありがとうございます。インスタンスフィールドを静的にした場合はどうなりますか?しかし、そのような簡単なオプションは存在しないと仮定します。 main()メソッドを削除しますか?私はコンストラクタがうまくいくと思っていましたが、主な方法は最初はテストに役立ちました。ビルドしようとしたコンストラクタで多くのエラーが発生しました。 –

+0

@AndréFoote:**非常に悪い考え。まともなOOP構造に固執し、コードに根本的な問題を解決するためにこの構造を曲げないでください。代わりに基本的な問題自体を修正してください。答える編集をご覧ください(すぐに)。 –

+0

質問の私の編集を参照してください。 –

関連する問題