2012-05-09 14 views
6

本当に必要なのは、インターフェイス内の通常の変数を宣言し、そのインターフェイスを2つのクラスに実装できることです。クラス(すなわち、class.variablesの代わりにclass.data.variables)。私は同じ目標を別々に達成できる方法はありますか?2つのクラスを同じ変数定義を共有するにはどうすればいいですか

さらに詳しく説明します。基本的に、JScrollPane上にあるJPanelにJLabelをドロップする小さな描画プログラムを作成しました。私はこれらのJLabelのための特定のデザインを持っているので(つまり、それらは、このアプリケーション用の航空会社オブジェクトを描くためだけではありません)、私はJLabelを拡張し、アプリケーション固有の変数を追加します。最終的には、これらの変数を使用してXMLファイルを読み書きし、設計をロードして保存できるようにします。この拡張クラスをXML定義に使用することはできないので、アクセサーとしてNONEを持っていると言いましたが、親クラスについては悲鳴を上げるため(バグがあります)、同じクラスを作成して値を元に戻す必要があります保存と読み込みのためにJLabel拡張クラスに変数を追加し、それをXML模倣クラスおよび後続のコピールーチンに追加することを忘れた場合を除いて、あまり問題はありません。

余分なデータ宣言を保持する1つのクラス(たとえばCellDataRecord.java)を作成し、そのクラスを(JLabel拡張とXMLデータ)両方で使用する必要がなくても大丈夫ですXML.data.CellDataRecordXXXのようなものです。

+0

は* *ミックスインと呼ばれます - Javaにはそれらがありません。あなたは既に慣れ親しんだ1つのパターンまたはもう1つのパターンに頼らなければなりません。 –

+0

私と同じ問題です。 – Acewin

答えて

5

継承を使用して、またはインターフェイスを使用して、変数を親クラスの定数として設定することができます。あなたはJLabelのを拡張しているので、あなたは両方のクラスにインターフェースを実装する必要があります。

public interface MyInterface { 
    int someint = 9; 
} 

public class MyClass1 extends JLabel implements MyInterface { 
    //this class has access to `someint` 
} 

public class MyClass2 extends JLabel implements MyInterface { 
    // also has access to `someint` 
} 

編集

あなたは異なるクラスから同じ変数を変更することができるようにしたいので、あなたが持っているあなたは「AREN確保するためにコピーを変更して同じ変数を変更しているので、変数にvolatileキーワードを使用して、すべてのスレッドが値を確認してから更新するようにjavaに指示する必要があります。

これで、値を取得するためにインスタンスを他のクラスから作成できるように、別のクラスを用意する必要があります。 staticキーワードを使用して、すべてのクラスインスタンスに対して1つのコピーが確実に保持されるようにする必要があります。

public class MyVariableWrapper { 
    public static volatile int some_var = 9; 
    public void updateSomeVar(int newvar) { 
     some_var = newvar; 
    } 
    public int getSomeVar() { return some_var; } 
} 

今、他の2つのクラスがちょうどこの操作を行います。

public class MyClass1 extends JLabel { 
    MyVariableWrapper myVariableWrapper; 
    MyClass1() { 
     super(); 
     myVariableWrapper = new MyVariableWrapper(); 
     // now I have access to `some_var` 
    } 
} 

public class MyClass2 extends JLabel { 
    MyVariableWrapper myVariableWrapper; 
    MyClass2() { 
     super(); 
     myVariableWrapper = new MyVariableWrapper(); 
     // now I have access to the same `some_var` as MyClass1 
    } 

    // this is a wrapper method for your convenience 
    // since you don't like the excess code when accessing the variable 
    public int getSomeVar() { 
     return myVariableWrapper.some_var; 
     // or myVariableWrapper.getSomeVar(); 
    } 
    public void setSomeVar(int newvar) { 
     myVariableWrapper.some_var = newvar; 
     // or myVariableWrapper.setSomeVar(newvar); 
    } 
} 

今、あなたはこれを行うことができます:あなたが記述している何

MyClass2 myClass2 = new MyClass2(); 
System.out.println(""+myClass2.getSomeVar()); 
+0

私が理解しているのは、私がインターフェースを使うと、私の "変数"はすべて "定数"になり、変数にする必要があるということです。だから、私が正しく理解すれば、インターフェイスは私のために働かないでしょう。 –

+0

@JesterHawkああ、変数を独自のクラスで 'static'と' volatile'として宣言し、変数を必要とする2つのクラスからそのクラスのインスタンスを作成するだけです。 http://ilkinbalkanay.blogspot.co.uk/2007/10/volatile-variables-in-java.html – Ozzy

+0

@JesterHawkも私の更新された回答を参照してください – Ozzy

1

私はあなたの問題を100%把握していませんが、説明の最初の数行から、インターフェイスを実装する代わりに、抽象クラスを定義してクラスを拡張することができます。そうすれば、抽象クラスの属性を定義することができ、これらはすべてのサブクラスに共通のものになります。

+1

彼はすでに 'JLabel'を拡張しています。 –

+0

はい、私はJPanelに描画する能力が必要なので、JLabelを継承しているということです。そして、私はクラスがJLabelと抽象クラス(実際にはクールで役に立つもの)の両方を拡張することができないので、それはうまくいきません。 –

+0

私はクラスのコンポーネントとしてJLabelを試しましたが、描画部分に問題がありました。おそらく私の知識の欠如。しかし、本質的に私は除去の問題があった。たとえば、ユーザーがマウスを重ねてクリックすると、JLabelを含む「セル」が削除されます。私はそれをペインから削除することができますが、ArrayList内のどのセルが不安定であるかを見つけることができました。私はコンポーネントをチェックしていたが、必ずしもコンポーネントを見つけられなかった。だから、私はJPanelとArrayListの両方から "セル"を削除する信頼できる方法がなくなりました。もう一度、おそらく私の知識の欠如。 –

関連する問題