私は検索しましたが、同様の問題に対する解決策は見つかりませんでした。 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);}
}
}
"firstmap"クラスにはすでにrepaint()メソッドがあります。 "firstmap"はActionListenerを実装しています。メソッドは次のとおりです: '@Override \t public void actionPerformed(ActionEvent e){ \t \t updateCraft(); \t \t repaint(); \t}「 – Thomasp
あなたはactionPerformedイベントが発生していますか? – Lee
はい、変更が反映されているため、ウィンドウがフォアグラウンドにあるときに起動します。 – Thomasp