2012-05-18 26 views
0

內成員變量我有幾個成員變量,其中之一是一個DefaultTableModel的類。我的類的構造函數使用MySQL ResultSet來填充DefaultTableModel。我想生成DefaultTableModel的精確副本並將其作爲另一個成員變量存儲在我的類中,因此我可以在保留原始變量副本的同時編輯我的類中的變量副本。克隆1的Java類

下面是我班的輪廓。

public class MyClass() { 

    int i; 
    Boolean b; 
    DefaultTableModel model; 
    DefaultTableModel model2; 

    MyClass(ResultSet myRS) { 
     //code to initialize i,b,model; 
     //code to clone model and save as model2; 
     //code to modify model2; 
    } 

    public DefaultTableModel getModels(String s) { 
     //code that returns model or model2; 
    } 

} 

我一直在做一些閱讀,但還沒有想出如何使一個類中的一個變量的精確副本。我知道我不能僅僅執行model2 = model;,因爲這只是複製變量的引用。我犯了這個錯誤,發現編輯model2也會編輯模型。我所讀到的關於克隆的一切都讓它看起來只是用來創建一個新的完全相同的類的實例。任何有關如何克隆類中的單個變量的建議將不勝感激。

回答

1

通常情況下,如果它是你自己的TableModel子類,而不是DefaultTableModel你可以通過讓你TableModel實施Clonable,並通過調用clone()方法得到一份拷貝實現這一目標。

當你與DefaultTableModel情況下工作,你必須繞走另一條路,並做到這一點:

而不是創建用於傳遞數據的DefaultTableModel構造一個Object[][]Vector實例,創建兩個副本Object[][]Vector。有了這些,您可以創建具有相同內容的兩個DefaultTableModel實例。

+0

感謝您的幫助。我希望使用克隆來做一些更優雅的事情,但是那樣做了。 – Riggster

1

使用clone()方法即創建對象的確切副本你想克隆什麼。 要允許克隆你的課程,必須實現接口Cloneable。然後您必須從您實施的界面覆蓋克隆方法。

小例子:

public class TableClass implements Cloneable { 


    private DefaultTableModel model; 


    @Override 
    public Object clone() { 
     DefaultTableModel cloned = null; 
     try { 
      cloned = (DefaultTableModel) super.clone(); 
     } 
     catch (CloneNotSupportedException ex) { 
      Logger.getLogger(TableClass.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return cloned; 
    } 

由於clone()方法返回的Object實例,必須轉換爲類型的對象:cloned = (DefaultTableModel) super.clone()

因此,這是如何工作的clone()。現在你可以實現你自己的tableMode了。

基本例如:

public class YourTableModel extends AbstractTableModel implements Cloneable { 


    private static final String[] columnNames = {"URL", "Progress", "Size", "Status"}; 
    private static final Class[] columnClasses = {String.class, String.class, String.class, String.class}; 

    private List<T> yourData; 

    @Override 
     public Object clone() { 
      YourTableModel cloned = null; 
      try { 
       cloned = (YourTableModel) super.clone(); 
      } 
      catch (CloneNotSupportedException ex) { 
       Logger.getLogger(TableClass.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      return cloned; 
     } 

    @Override 
    public Object getValueAt(int row, int col) { 
     switch (col) { 
      case 0: 
       return yourData.getName(); 
      case 1: 
       return yourData.getAge(); 
      case 2: 
       return yourData.getAddress(); 
      case 3: 
       return yourData.getSomethingElse(); 
     } 
     return ""; 
    } 

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

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

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

    public Class getClassName(int col) { 
     return columnClasses[col]; 
    } 
} 

這樣你實現你自己的模型也clone()方法,然後您可以克隆該對象。但也有其他方法,如寫道@vizier

希望它有幫助!

+0

我真的很感謝你的幫助。不過,我很難理解你在說什麼。你介意把你的代碼插入到我原來的問題中的示例類中嗎?謝謝。 – Riggster

+0

您想按照您所寫的方式(model2 = model)創建DefaultTableModel的副本,但這只是一個對象,但您希望創建一個對象的兩個精確副本,然後您可以執行任何想做的事情。這是示例如何使用clone()方法。 – Sajmon