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修饰符)。

然后,您的模型实现getColumnCount()getRowCount()返回 0。这意味着您的表包含 0 行和 0 列。因此,如果您不打算在其中使用任何价值,我真的看不出使用表格的意义。

getValueAt()另一方面,该方法意味着所有行都包含相同的值,因为无论rowIndex参数包含什么,您都返回相同的值。

最后,你说你有一个Map<Files, String>,但你没有说这张地图和表格之间的关系应该是什么。您不会在模型中的任何地方使用此地图,并且由于代码本身没有意义,因此很难猜测地图实际包含的内容以及表格应实际显示的内容。

于 2013-04-06T11:49:44.547 回答
1

我需要一个键/值对。

作为参考,从现有EnvTableTest的. 它使用地图的零列,并使用每个键来获取该行的值。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 回答