0

いくつかのメンバー変数を持つクラスがあり、そのうちの 1 つは 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 を編集するとモデルも編集されることがわかりました。クローンについて読んだことはすべて、クラス全体の新しい同一のインスタンスを作成するために使用されているように見えます。クラス内の単一の変数を複製する方法についてのアドバイスは大歓迎です。

4

2 に答える 2

1

クローンしたいオブジェクトの正確なコピーをclone()作成するメソッドを使用します。複製を許可するには、クラスに interface を実装する必要があります。次に、実装するインターフェースから 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のような他のアプローチもあります

それが役に立てば幸い!

于 2012-05-18T15:56:01.803 に答える
0

通常、それが独自の TableModel サブクラスである場合は、メソッドを呼び出して実装し、コピーを取得するDefaultTableModelことでこれを実現できます。TableModelClonableclone()

DefaultTableModelインスタンスで作業しているときは、逆の方法でこれを行う必要があります。

データを のコンストラクターに渡すために単一のObject[][]またはVectorインスタンスを作成する代わりに、またはDefaultTableModelの 2 つのコピーを作成します。これらを使用すると、同じコンテンツで両方のインスタンスを作成できます。Object[][]VectorDefaultTableModel

于 2012-05-18T15:47:42.140 に答える