0

我有一个正在开发的客户端/服务器 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;
}

我不想继续将越来越多的 JInternalFrames 传递给 MyCommandReciever。

做这样的事情有意义吗??

Component[] c = panel.getComponents();
for(int i = 0; i < c.length; i++) {
    System.out.println(c[i].getClass().getSimpleName());
}

或者有没有一种方法可以在我的主类中创建我的主类(包括我的 GUI)的实例,并将其传递给 MyCommandReciever,以便它可以访问所有内容(可能像这样):

MyCommandReciever(DataInputStream commandIn, DefaultListModel modelUserList, MyClient m){

如果最后一种方法是可行的方法(我希望不是,我是否需要将它从创建它的实例的类(Character.java 创建 MyClient.java 的实例)传递给它自己( MyClient.java),然后将它从 MyClient.java 传递给 MyCommandReciever.java?

抱歉,如果最后一个问题太令人困惑......让我分解一下:

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 显然,我把我的大脑包裹在了最后一个想法上。

4

2 回答 2

3

您可以做的是使用称为“观察者”或“事件源”的模式:

  1. 定义命令接收器和主类之间的接口,以及当有趣的事情发生时命令接收器应该调用的方法。
  2. (显然,命令接收器应该持有对实现此接口的对象的引用,以便能够发送事件。)
  3. 在主类中实现接口——通过主类本身或嵌套类——并通过更新接口来响应来自命令接收器的事件。将实现传递给命令接收器。

这样,命令接收器和用户界面就完全解耦了,如果在某个时候您决定使用JInternalFrame数据显示以外的东西,您不必在数百个地方更改代码。

您也可以考虑使用 MVC 或其众多兄弟姐妹之一。

于 2012-04-26T07:34:48.920 回答
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]);
}
于 2012-04-26T18:15:11.877 回答