2016-05-04 10 views
0

私は検索しましたが、同様の問題に対する解決策は見つかりませんでした。 Observer/Observableパターンに問題があります。観測は、「firstmap」と呼ばれるクラスで実装され、クラスは次のとおりです。GUIウィンドウが最上部にないと、Java Observerが更新されない

class ObservableValue extends Observable{ 
    private String n; 
    public ObservableValue(String n) 
     { 
      this.n = n; 
     } 
    public void setValue(String n) 
     { 
      this.n = n; 
      setChanged(); 
      notifyObservers(); 

     } 
     public String getValue() 
     { 
      return n; 
     } 
} 

public class TextObserver implements Observer 
{ 
private ObservableValue ov = null; 
private multiwindow window1; 
public TextObserver(ObservableValue ov, multiwindow window1) 
{ 
    this.ov = ov; 
    this.window1=window1; 
} 
public void update(Observable obs, Object obj) 
{ 
    if (obs == ov) 
    { 
    System.out.println(ov.getValue()); 
    String[] tmp = ov.getValue().split(","); 
    window1.destMessage(tmp[0], tmp[1]); 
    } 
} 
} 

問題は、ウィンドウ「firstmapは」最前面にあるとき、更新のみ実行されることです。それ以外の場合は、ウィンドウを前面に移動するまで更新されません。バックグラウンドで実行中であっても更新する方法はありますか?おかげさまで

編集:「firstmap」はJFrameであるとは言いませんでした。

EDIT2:いくつかの詳細:

"firstmapは、" オブジェクトの動きを示すマップです。オブジェクトが特定の位置に到達すると、別のJFrame(「マルチウィンドウ」)にメッセージを表示します。コードが今のように、メッセージは "firstmap"がフォアグラウンドにあるときにのみ表示されます。バックグラウンドでのJFrameオブジェクトの「firstmap」クラスで

ObservableValue ov = new ObservableValue(""); 
TextObserver to = new TextObserver(ov, window1); 
public firstmap() { 
    this.setTitle("Map"); 
    ov.addObserver(to); 
    window1.setVisible(true); 
    canvas = new DrawCanvas(); 
    this.setContentPane(canvas); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setVisible(true); 
    this.pack(); 
    this.setSize(width, height); 
    canvas.setPreferredSize(new Dimension(width, height)); 
    this.setAlwaysOnTop(true); 
    timer = new Timer(DELAY, this); 
    timer.start(); 
    this.setVisible(true); 
} 

がある...

for (int i = 0; i < window1.getaircraftlist().size(); i++) { 

      if (window1.getaircraftlist().get(i).getReached()==false) { 
       g.drawImage(window1.getaircraftlist().get(i).getImage(), window1.getaircraftlist().get(i).getX(), 
        window1.getaircraftlist().get(i).getY(), this); 

      } 
      else { 
       if (((window1.getaircraftlist().get(i).getDestFixPointName()=="IAF")||(window1.getaircraftlist().get(i).getDestFixPointName()=="AIRPORT")) && k[i]==0){ 
        g.drawImage(window1.getaircraftlist().get(i).getImage(), window1.getaircraftlist().get(i).getX(), 
          window1.getaircraftlist().get(i).getY(), this); 
        ov.setValue(window1.getaircraftlist().get(i).name+","+window1.getaircraftlist().get(i).getDestFixPointName()); 
        k[i]=1; 

       } 
       else if (((window1.getaircraftlist().get(i).getDestFixPointName()=="IAF")||(window1.getaircraftlist().get(i).getDestFixPointName()=="AIRPORT")) & k[i]==1){ 
        g.drawImage(window1.getaircraftlist().get(i).getImage(), window1.getaircraftlist().get(i).getX(), 
          window1.getaircraftlist().get(i).getY(), this); 
       } 
       else 
       { 
        ov.setValue(window1.getaircraftlist().get(i).name+","+window1.getaircraftlist().get(i).getDestFixPointName()); 
        window1.getaircraftlist().remove(i);} 
      } 
     } 

答えて

0

私はあなたが(再描画を呼び出すと逃げることができるかもしれないと思います) - EDTで実行されているペイントアルゴリズムに問題のあるディメンションを追加する必要があります。

これがGUIの更新に失敗した場合、それは観測されたモデルへの変更がJFrameモデルに伝播されていないことを示しています。

+0

"firstmap"クラスにはすでにrepaint()メソッドがあります。 "firstmap"はActionListenerを実装しています。メソッドは次のとおりです: '@Override \t public void actionPerformed(ActionEvent e){ \t \t updateCraft(); \t \t repaint(); \t}「 – Thomasp

+0

あなたはactionPerformedイベントが発生していますか? – Lee

+0

はい、変更が反映されているため、ウィンドウがフォアグラウンドにあるときに起動します。 – Thomasp

関連する問題