2013-04-06 56 views
0

我有以下代碼:重寫「getValueAt」中AbstractTableModel的綁定映射到JTable中

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天,真的很感謝一些幫助。

回答

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

有很多錯誤。

首先,爲什麼文件中的所有字段和方法都是靜態的?這意味着一個Files實例根本沒有狀態,並且所有的Files實例共享相同的文件,持續時間和狀態。 Thos字段和方法當然應該是實例字段和方法(也就是說,您必須刪除static修飾符)。

然後,您的模型通過返回0實現getColumnCount()getRowCount()。這意味着您的表包含0行和0列。所以如果你不打算有任何價值的話,我真的不明白使用表格的意義。

另一方面,getValueAt()方法意味着所有行都包含相同的值,因爲無論rowIndex參數包含哪個值都會返回相同的值。

最後,你說你有一個Map<Files, String>,但你沒有說這張地圖和表格之間的關係應該是什麼。您不會在模型中的任何位置使用此映射,並且由於代碼沒有任何意義,因此很難猜測映射實際包含的內容以及表應實際顯示的內容。

+0

感謝您的輸入。對Java很新。所以我希望文件中的3個變量(文件,持續時間和狀態)在JTable中顯示爲三列。 – Omid 2013-04-06 12:32:46

+0

和地圖有什麼關係?你想在表中顯示一個文件,因此它有1行3列嗎?你是否已經根據我已經給你的指示開始修復你的代碼? – 2013-04-06 12:44:02

+0

是,1行3列。但只要在地圖中添加值,它們也會被添加到JTable中。是的,我刪除了所有靜態。 – Omid 2013-04-06 12:47:42

1

我需要一個鍵/值對。

作爲參考,EnvTableTest構建從現有Map一個AbstractTableModel。它使用地圖的keySet()作爲零列,並使用每個鍵來獲取該行的值。

+0

getenv不工作時,密鑰的地圖是一個類。因此:private final Map list = System.getenv(); – Omid 2013-04-06 17:45:26

+0

@Omid:對,這只是一個相關的例子。 – trashgod 2013-04-06 17:50:03