我有一个客户端/服务器MMORPG我正在努力,我想做正确的事情(尽管不可能)。我的问题是:将对我的GUI项(JInternalFrame,JPanels等)的引用传递给我的类来监听服务器命令/回复的最佳方法是什么。现在这就是我的目标,很快就会变得非常大。
MyCommandReciever(DataInputStream commandIn, DefaultListModel modelUserList, JInternalFrame skillsFrame, Container skillsPanelHeader, Container skillsPanelContent, JInternalFrame characterFrame){
this.commandIn = commandIn;
this.modelUserList = modelUserList;
this.skillsFrame = skillsFrame;
this.skillsPanelHeader = skillsPanelHeader;
this.skillsPanelContent = skillsPanelContent;
this.characterFrame = characterFrame;
}
我不想继续将越来越多的JInternalFrame传递给MyCommandReciever。
做这样的事情是否有意义?
Component[] c = panel.getComponents();
for(int i = 0; i < c.length; i++) {
System.out.println(c[i].getClass().getSimpleName());
}
或者有没有办法可以在我的主类中创建我的Main类的实例(包括我的GUI),并将其传递给MyCommandReciever,以便它可以访问所有内容(可能是这样的):
MyCommandReciever(DataInputStream commandIn, DefaultListModel modelUserList, MyClient m){
如果最后一种方法是要走的路(我希望它不是,我是否需要从创建它的实例的类中传递它(Character.java创建MyClient.java的实例),自己(MyClient.java),然后将它从MyClient.java传递给MyCommandReciever.java?
对不起,如果最后一个问题太令人困惑了......让我分解一下:
Inside Character.java:
if (playSuccess.contains("true")){
z++; //to turn off the commandIn functionality in Character screen when MyClient is running
frame.dispose();
new MyClient(accountName, playWho, commandIn, messageIn, commandOut, messageOut, sM, sC);
MyClient.java内部:
commandReciever = new MyCommandReciever(commandIn, modelUserList, skillsFrame, skillsPanelHeader, skillsPanelContent, characterFrame);
所以在character.java中,我必须创建MyClient的实例(并分配给变量),但同时将该分配的变量传递给MyClient。 (现在我输入它似乎甚至不可能)。
请指导我:D很明显,我把我的大脑包裹在最后一个想法中。
答案 0 :(得分:3)
你可以做的是使用名为“观察者”或“事件来源”的模式:
这样命令接收器和用户界面完全解耦,如果在某些时候你决定使用JInternalFrame
之外的其他东西进行数据显示,则不必在数百个地方更改代码。
您也可以考虑使用MVC或其众多兄弟姐妹之一。
答案 1 :(得分:0)
这是我决定采用的方法。感谢其他建议,但对我的需求似乎有点复杂:
在我的主要gui班:
commandReciever = new MyCommandReciever(commandIn, this); //passing in instance of my main gui class
在我的命令接收器类(与服务器通信的类)中:
MyClient m; //for access to the GUI pieces
MyCommandReciever(DataInputStream commandIn, MyClient m){
this.commandIn = commandIn;
this.m = m;
}
我如何从命令接收器类编辑主gui类的组件的示例:
m.modelUserList.clear();
for (int i = 0; i < CharactersList.length; i++){
m.modelUserList.addElement(CharactersList[i]);
}