0

チャット担当者がラベルであるチャット プログラムを作成しています。ユーザーが をクリックすると、ラベルを画面上で移動できますanchorpane。ここには 2 つのシナリオがあります。

  1. チャット担当者はローカルに移動する必要があります。

  2. クライアントは、接続されている他のすべてのクライアントにこの動きを送信する必要があります。

2 番目のケースは、オブジェクトが現在のように機能する場合は簡単です。現在、私のChatPersonオブジェクトは次のようになっています。

 package GUI;


public class ChatPerson {

    private String username;
    private int x;
    private int y;
    // Brugerens ID i databasen
    private int id;

    public ChatPerson(String name){
        this.username = name;
    }

    public String getUserName(){
        return username;
    }
    public void setX(int x){
        this.x = x;
    }
    public void setY(int y){
        this.y = y;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
    public int getId(){
        return id;
    }
    public void setId(int id){
        this.id = id;
    }



}

私の質問は、この種の動作をどのように実装するかです。オブザーバーパターンを調べましたが、この場合にそれを機能させる方法が難しいと思いますか?

また、JavaFx には、ここで使用できる何らかの実装がありますか? 私はObservablelistを見てきましたが、それがどのように役立つのか本当に理解できませんか?

4

1 に答える 1

1

この場合、オブザーバー パターンを使用できます。各クライアントのどこかに接続されている人のリストがあると思います。これが一部の場合、移動イベントを他の人に通知するのは非常に簡単なはずです。そのようにChatPersonを観察可能にするだけです

public class ChatPerson {
     //your props here :P...
    private final List<MoveListener> listeners = new ArrayList<MoveListener>();

    private void notifyListeners(MoveEvent e){
        for(MoveListener l : listeners){
             l.onMoveEvent(e);
        }
    }
    public void addMoveListener(MoveListener l){
        this.listeners.add(l);
    }
    public void removeMoveListener(MoveListener l){
        this.listeners.remove(l);
    }

    //i would create a move method but you can do this on setX() and setY()
    public void move(int x,int y){
        this.x=x;
        this.y=y;
        this.notifyListeners(new MoveEvent(this,x,y));
    }
    //your other method...
}

次に、MoveListener インターフェイスについて説明します。

public interface MoveListener{
    public void onMoveEvent(MoveEvent e);
}

そしてMoveEvent。

public class MoveEvent{
    public final ChatPerson source;//i could be more generic but you get the ideea
    public final int currentX;
    public final int currentY;
    public MoveEvent(ChatPerson source, int x,int y){
        this.source = source;
        this.currentX = x;
        this.currentY = y;
    }
    //you can make the fields private and getters ofc :P
}

これで、ChatPerson が移動するたびに、適切で一般的な方法でその位置をブロードキャストします。これは、このイベントに応答して、各リスナーに送信されます。
コンテナー クラス (接続されているユーザーのリストを含むクラス) では、MoveListener を実装し、それを現在の ChatPerson に追加するだけです。
この実装では、接続されている人のリストを繰り返し処理し、いわば「ネットワーク経由で」現在の位置を送信できます。あなたのアプリがどのように実装されているかについての詳細がなければ、私は本当に良い答えを出すことはできません.
これが役立つことを願っています。

于 2012-12-16T17:39:12.737 に答える