0

次のコードがあります。

    class Files {       
    private static String files;
    private static String duration;
    private static String status;

    public Files(String files, String duration, String status) {
        this.files = files;
        this.duration = duration;
        this.status = status;
    }

    public static String getfiles() {
        return files;
    }

    public static String getduration() {
        return duration;
    }

    public static String getstatus() {
        return status;
    }
}

    Map<Files, String> hmap = new HashMap<Files,String>();

    private void AddFiles(String addfile,String addurr,String addstatus, String addpath){       
    Files f = new Files(addfile, addurr, addstatus);                
    hmap.put(f, addpath);       
}
    final JTable table = new JTable();
    table.setBounds(26, 27, 664, 274);
    table.setModel(new MyTableModel());

だから私は新しいテーブルを作成し、「getValueAt」をオーバーライドしています。

        class MyTableModel extends AbstractTableModel {    
        @Override
        public int getColumnCount() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public int getRowCount() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
             switch (columnIndex) {
             case 0:
                    return Files.getfiles(); 
             case 1:
                    return Files.getduration();
             case 2:
                    return Files.getstatus();
             default:
                    throw new IndexOutOfBoundsException();
             }
        }
    }

それでも、HashMap のクラス「ファイル」から変数を JTable にロードできません。誰が私が間違っているのか教えてもらえますか? 私は基本的に3日間立ち往生しており、本当に助けていただければ幸いです.

4

3 に答える 3

1

間違っていることがたくさんあります。

まず第一に、Files のすべてのフィールドとメソッドが静的なのはなぜですか。つまり、Files インスタンスには実際にはまったく状態がなく、すべての Files インスタンスが同じファイル、期間、およびステータスを共有します。これらのフィールドとメソッドは、代わりにインスタンス フィールドとメソッドにする必要があります (つまり、static修飾子を削除する必要があります)。

その後、モデルは 0 を返すことgetColumnCount()で andを実装getRowCount()します。これは、テーブルに 0 行と 0 列が含まれていることを意味します。したがって、テーブルに値を持たせるつもりがない場合、テーブルを使用する意味がわかりません。

一方、メソッドは、引数に含まれるものがgetValueAt()何であれ同じ値を返すため、すべての行に同じ値が含まれることを意味します。rowIndex

最後に、あなたは を持っていると言っていますが、Map<Files, String>このマップとテーブルの間の関係がどうあるべきかは言っていません。このマップはモデルのどこにも使用されません。コードはそのままでは意味をなさないため、マップに実際に何が含まれているか、テーブルに実際に何を表示する必要があるかを推測するのは困難です。

于 2013-04-06T11:49:44.547 に答える
1

キーと値のペアが必要です。

参照用に、既存EnvTableTestの から を構築します。列 0のマップを使用し、各キーを使用してその行の値を取得します。AbstractTableModelMapkeySet()

于 2013-04-06T14:17:01.370 に答える
0

わかりました解決策を見つけました:

private final Map<Files, String> list = new LinkedHashMap<Files,String>();

class MyTableModel extends AbstractTableModel {

private String[] columnNames = {"File","Duration","Status"};

public void addElement(String addfile,String addurr,String addstatus, String addpath) {             
Files f = new Files(addfile, addurr, addstatus);                
list.put(f, addpath); // edit
fireTableRowsInserted(list.size()-1, list.size()-1);   
}

@Override
public int getColumnCount() {
return columnNames.length;
}

@Override
public int getRowCount() {
return list.size();
}

@Override
public String getColumnName(int col) {
return columnNames[col];
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {

List<Entry<Files,String>> randAccess = new ArrayList<Entry<Files,String>>(list.entrySet());

switch (columnIndex) {
case 0:
return randAccess.get(rowIndex).getKey().getfiles();
case 1:
return randAccess.get(rowIndex).getKey().getduration();
case 2:
return randAccess.get(rowIndex).getKey().getstatus();
default:
throw new IndexOutOfBoundsException();
        }
    }
}
于 2013-04-06T19:14:45.850 に答える