Я искал, но не нашел решения для аналогичной проблемы. У меня проблема с шаблоном 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);}
}
}
У меня уже есть метод repaint() в классе «firstmap». «Firstmap» реализует ActionListener, и у меня есть метод: '@Override \t public void actionPerformed (ActionEvent e) { \t \t updateCraft(); \t \t repaint(); \t} ' – Thomasp
Вы уверены, что событие actionPerformed уволено? – Lee
Да, он запускается, когда окно находится на переднем плане, потому что я вижу изменения на нем. – Thomasp