0

我有一个包含多个成员变量的类,其中一个是 DefaultTableModel。我的类构造函数使用 MySQL ResultSet 来填充 DefaultTableModel。我想生成 DefaultTableModel 的精确副本并将其作为另一个成员变量存储在我的类中,因此我可以在我的类中编辑变量的副本,同时保留原始变量的副本。

下面是我的课堂大纲。

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也会编辑model。我读到的所有关于 clone 的东西都让人觉得它只是用来为整个类创建一个新的、相同的实例。任何关于如何在类中克隆单个变量的建议将不胜感激。

4

2 回答 2

1

使用clone()创建您想要克隆的对象的精确副本的方法。要允许克隆你的类必须实现 interface 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 所写

希望能帮助到你!

于 2012-05-18T15:56:01.803 回答
0

通常,如果它是您自己的 TableModel 子类,而不是DefaultTableModel您可以通过制作TableModel实现并通过调用该方法Clonable获取副本来实现这一目标。clone()

当您使用DefaultTableModel实例时,您必须反其道而行之:

不要创建一个Object[][]orVector实例来将数据传递给 的构造函数,而是创建or的DefaultTableModel两个副本。使用这些,您可以创建具有相同内容的两个实例。Object[][]VectorDefaultTableModel

于 2012-05-18T15:47:42.140 回答