将GUI引用传递给编辑它们的其他类的最佳方法

时间:2012-04-26 07:03:11

标签: java pass-by-reference

我有一个客户端/服务器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很明显,我把我的大脑包裹在最后一个想法中。

2 个答案:

答案 0 :(得分:3)

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

  1. 定义命令接收器和主类之间的接口,使用命令接收器在发生有趣事件时应调用的方法。
  2. (显然,命令接收器应该对实现此接口的对象持有一个refence,以便能够发送事件。)
  3. 在主类中实现接口 - 通过主类本身或嵌套类 - 并通过更新接口来响应来自命令接收器的事件。将实现传递给命令接收器。
  4. 这样命令接收器和用户界面完全解耦,如果在某些时候你决定使用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]);
}