我正在创建一个聊天程序,我的聊天人员是一个标签。当用户点击anchorpane
时,标签可以在屏幕上移动,现在这里有两个senerios:
聊天员必须在本地移动。
客户必须将此动作发送给所有其他连接的客户端。
第二种情况很容易,如果对象正常工作,那么我的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,但我真的不明白这会对我有什么帮助吗?
答案 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中。
在此实现中,您可以迭代连接人员列表并“通过网络”发送当前位置。如果没有更详细的应用程序实现方式,我无法给出更好的答案
希望这有帮助。