2016-09-26 7 views
0

JComponentを2つの異なるコンテナに追加することはできませんが、これを模倣する方法が必要です。私はオーバーライドされた描画メソッドを持つJLabelを持っています。このラベルを2つのJFramesに同時に表示します。両方に追加することはできないので、1つのJLabelを再描画して別のものに見えるようにするにはどうすればいいですか?もう1つのJFrameはそれを反映しますか?JComponentを別のミラーにする方法はありますか?

+0

通常、JComponentをミラーリングするには、いくつかのコードを記述します。あなたはこれをしましたか?あなたが間違っていることを人々が見て、それを修正するのを助けるために投稿することができるかもしれません – Tibrogargan

+0

'私は、オーバーライドされた描画メソッドを持つJLabelを持っています - ' draw()メソッドがないので、 JLabel。おそらく、あなたはBufferedImageでカスタムペインティングを行うべきです。次に、BufferedImageを使用してImageIconを作成することができます。アイコンは複数のラベルで共有できます。 – camickr

+0

'RepaintManager'を使った別のアプローチは引用されています[ここ](http://stackoverflow.com/a/6333584/230513)。 – trashgod

答えて

2

これが私の問題だったら、私はそのJComponentを作成するためのクラスを作成しました(私はJPanelを使いたいと思っています)。これにはMVCまたは "Model-View-Controller"タイプのプログラム構造を使用しますプログラム。このモデルは、表示されるグラフィカルオブジェクトの論理表現を含むプログラムのロジックの状態を保持し、ビューはJPanelを拡張したクラスであり、必要に応じて保持されるデータを表示しますモデル。私はこれらの生き物のうちの2つを作り、それらを持っています同じモデルを共有する - これは鍵です。次に、変更が1つに発生すると、その両方に表示されます。

コードに関する詳しい説明とより詳しい説明が必要な場合は、有効なminimal example programを作成して転記することを検討してください。

2

あなたは、モデル - ビューパターン使用する必要があります:あなたのモデルは、単一の文字列を持つクラスだろう

https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel

を。あなたのビュー、つまりモデルが変更されたときにJLabelに通知する必要があります。あなたがいることをオブザーバーパターンを使用して行うことができます。これは、

https://en.wikipedia.org/wiki/Observer_pattern

、あなたのモデルは、オブザーバーのリストを保持し、あなたがモデルを更新するたびに、すべてのオブザーバが通知を得ます。例:

class Model { 
    public interface Observer { 
     void onTextChanged(); 
    } 
    private String text; 
    final private List<Observer> observerList = new ArrayList<>(); 

    public void addObserver(Observer observer) { 
     observerList.add(observer); 
    } 

    public void setText(String text) { 
     this.text = text; 
     for (Observer observer : observerList) 
      observer.onTextChanged(); 
    } 

    public String getText() { 
     return text; 
    } 
} 

このようにして、必要な数のビュー/ JLabelsでモデルを表示できます。たとえば、次のようになります。

final JLabel label = new JLabel(); 
model.addObserver(new Model.Observer() { 
     public void onTextChanged() { 
      label.setText(model.getText()); 
     } 
    }); 
final JLabel label2 = new JLabel(); 
model.addObserver(new Model.Observer() { 
     public void onTextChanged() { 
      label2.setText(model.getText()); 
     } 
    }); 
+0

ディーセント・アンサー1+ –

関連する問題