2016-05-04 3 views
0

Я искал, но не нашел решения для аналогичной проблемы. У меня проблема с шаблоном Observer/Observable. Наблюдаемые реализуется в классе под названием «firstmap» и классы:Java Observer не обновляется, когда окно GUI не находится наверху

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 («multiwindow»). Теперь, как это делается, сообщение появляется только тогда, когда на первой полосе находится «firstmap».

В классе «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

Я думаю, вы могли бы уйти с вызовом перекрасить() объекта JFrame в фоновом режиме - это должно добавить нарушающие размеры к алгоритму окраски, работающему на EDT.

Если это не позволяет обновить GUI, это знак того, что изменения наблюдаемой модели не распространяются на модель JFrame.

+0

У меня уже есть метод repaint() в классе «firstmap». «Firstmap» реализует ActionListener, и у меня есть метод: '@Override \t public void actionPerformed (ActionEvent e) { \t \t updateCraft(); \t \t repaint(); \t} ' – Thomasp

+0

Вы уверены, что событие actionPerformed уволено? – Lee

+0

Да, он запускается, когда окно находится на переднем плане, потому что я вижу изменения на нем. – Thomasp

 Смежные вопросы

  • Нет связанных вопросов^_^