2012-05-18 31 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