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

Java 将GUI引用传递给其他编辑它们的类的最佳方法,java,pass-by-reference,Java,Pass By Reference,我有一个客户机/服务器MMORPG,我正在工作,我想做正确的事情(因为它是不可能的)。我的问题是:将对GUI项(JInternalFrame、JPanels等)的引用传递给侦听服务器命令/回复的类的最佳方式是什么。这就是我现在正在做的,很快就会变得很大 MyCommandReciever(DataInputStream commandIn, DefaultListModel modelUserList, JInternalFrame skillsFrame, Container skillsPa

我有一个客户机/服务器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传递给MyCommandrecever

这样做有意义吗

Component[] c = panel.getComponents();
for(int i = 0; i < c.length; i++) {
    System.out.println(c[i].getClass().getSimpleName());
}
如果最后一种方法是可行的(我希望不是,那么我是否需要将它从创建它的实例的类(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的实例(并分配给variable),但同时将分配的变量传递给MyClient(现在我输入这个,这似乎不可能)


请指导我:D显然,我对最后一个想法已经绞尽脑汁了。

你能做的就是使用一种称为“观察者”或“事件源”的模式:

  • 定义命令接收者和主类之间的接口,以及在发生有趣的事情时命令接收者应该调用的方法
  • (显然,命令接收器应该持有对实现此接口的对象的引用,以便能够发送事件。)
  • 在主类中实现接口——通过主类本身或嵌套类实现——并通过更新接口响应来自命令接收器的事件。将实现传递给命令接收器
  • 这样,命令接收器和用户界面就完全解耦了,如果在某个时刻您决定使用除
    JInternalFrame
    之外的其他内容来显示数据,则不必在数百个位置更改代码


    你也可以考虑使用MVC或它的许多兄弟姐妹。

    < P>你可以做的是使用被称为“观察者”或“事件源”的模式:

  • 定义命令接收者和主类之间的接口,以及在发生有趣的事情时命令接收者应该调用的方法
  • (显然,命令接收器应该持有对实现此接口的对象的引用,以便能够发送事件。)
  • 在主类中实现接口——通过主类本身或嵌套类实现——并通过更新接口响应来自命令接收器的事件。将实现传递给命令接收器
  • 这样,命令接收器和用户界面就完全解耦了,如果在某个时刻您决定使用除
    JInternalFrame
    之外的其他内容来显示数据,则不必在数百个位置更改代码


    你也可以考虑使用MVC或者它的许多兄弟姐妹。

    < P>这是我决定采用的方法。谢谢你的其他建议,但是对我的需求来说似乎有点复杂:

    在我的主要gui类中:

    commandReciever = new MyCommandReciever(commandIn, this); //passing in instance of my main gui class
    
    在我的命令接收者类(与服务器对话的类)中:

    如何从命令接收器类编辑主gui类组件的示例:

    m.modelUserList.clear();
    for (int i = 0; i < CharactersList.length; i++){
        m.modelUserList.addElement(CharactersList[i]);
    }
    
    m.modelUserList.clear();
    for(int i=0;i
    这是我决定采用的方法。谢谢你的其他建议,但对于我的需求来说,这似乎有点复杂:

    在我的主要gui类中:

    commandReciever = new MyCommandReciever(commandIn, this); //passing in instance of my main gui class
    
    在我的命令接收者类(与服务器对话的类)中:

    如何从命令接收器类编辑主gui类组件的示例:

    m.modelUserList.clear();
    for (int i = 0; i < CharactersList.length; i++){
        m.modelUserList.addElement(CharactersList[i]);
    }
    
    m.modelUserList.clear();
    for(int i=0;i
    只是想澄清一下:Java中的每个对象都是通过引用传递的。因此MyCommandReceiver应该从服务器获取信息并更新您的GUI元素?我会重新表述您的标题并重新标记。因为这是关于GUI设计的。您不应该将UI元素的引用传递给其他类。UI元素只应该由UI类更改s、 请参阅@hellectronic Ahem@Tharwen Ok很高兴知道。感谢您澄清:Java中的每个对象都是通过引用传递的。因此MyCommandReceiver应该从服务器获取信息并更新您的GUI元素?我会重新表述您的标题并重新标记。因为这是关于GUI设计的。您不应该将UI元素的引用传递给其他类UI元素只能由UI类更改。请参阅@hellectronic Ahem@Tharwen Ok很高兴知道。谢谢你的帮助,我也阅读了你建议的大部分内容,但对于一个人的团队来说,这似乎太复杂了,正在进行一个不会被重新设计的游戏。我真诚地感谢你的帮助,因为只需键入我的问题就有帮助了我提出了我的解决方案,我将在这里添加它,以帮助同一条船上的任何其他人。我感谢你的帮助,并且我阅读了你建议的大部分内容,但对于一个人的团队来说,这似乎太复杂了,正在进行一场不会被重新设计的比赛。我真诚地感谢你的帮助,因为仅仅键入我的问题就帮助我提出了我的解决方案这个解决方案就是我建议的,只是你没有在干净的接口后面隐藏“主类”的必要混乱。如果你的项目很小,你不太可能遇到麻烦,但是在一个较大的项目中,两个模块之间的访问不受限制(就像这里的gui和命令接收器)可能会成为一个问题。例如,假设gui的某些部分命令接收器不会/不应该被使用,但现在您无法知道它是否被使用。我建议使用此解决方案