使用Observer模式移动标签(JavaFx)

时间:2012-12-16 01:46:46

标签: java javafx observer-pattern

我正在创建一个聊天程序,我的聊天人员是一个标签。当用户点击anchorpane时,标签可以在屏幕上移动,现在这里有两个senerios:

  1. 聊天员必须在本地移动。

  2. 客户必须将此动作发送给所有其他连接的客户端。

  3. 第二种情况很容易,如果对象正常工作,那么我的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,但我真的不明白这会对我有什么帮助吗?

1 个答案:

答案 0 :(得分: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中。 在此实现中,您可以迭代连接人员列表并“通过网络”发送当前位置。如果没有更详细的应用程序实现方式,我无法给出更好的答案 希望这有帮助。