【问题标题】:Java using MainWindow functionsJava 使用 MainWindow 函数
【发布时间】:2014-03-25 21:24:17
【问题描述】:

所以我有一个MainWindow.java,它创建了一个包含所有控件和东西的窗口。我在窗口上放了一个菜单栏对象,菜单栏中的选项之一是使程序成为服务器。所以这里的主窗口看起来像这样:

public class MainWindow extends javax.swing.JFrame {
     //all code including menubar click action handler
     //Server.start()
}

当您单击该选项时,它会进入Server.java 类并启动服务器。这是该类的骨架:

public class Server {

    public static void start(String port) {
        try {
            startServer(Integer.parseInt(port));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void startServer(int PORT) throws Exception {
        ...
    }

    private static class ClientListenThread extends Thread {

        public ClientListenThread(Socket socket, int ClientNumber){
            ...
        }

        public void run() {
            ...
        }
    }

    private static class ServerSendThread extends Thread {

        public ServerSendThread(Socket socket) {
            ...
        }

        public void run() {
            ...
        }
    }
}

现在的问题是,一旦它进入 Server 类,它会侦听连接并正常连接,但我无法回到 MainWindow 类。它位于Server 类中。我什至不能通过 MainWindow.function() 调用 MainWindow 函数,因为它说

Cannot make a static reference to the non-static method function() from the type MainWindow

我什至尝试将所有 Server 类代码放入 MainWindow 类或就在它上面,但 Java 不喜欢这样,并说它希望将它放在一个单独的文件中。

我究竟如何从 Server 类中引用 MainWindow 函数?还是有更好的方法来解决这个问题?

【问题讨论】:

    标签: java swing class sockets tcp


    【解决方案1】:

    您需要使用 MainWindow m = new MainWindow() 创建 MainWindow 类的实例,然后将该函数调用为 m.function(),或者将您的函数声明为静态。

    静态意味着您可以在不创建对象实例的情况下调用函数。这就是您收到错误的原因,因为您的函数不是静态的,因此它需要调用对象的实例。

    您还需要确保将 MainWindow 类导入到 Server 类中。

    【讨论】:

    • 我还有 1 个问题。因此MainWindow 类具有菜单栏,当您从菜单栏中选择服务器选项时,会出现一个弹出窗口。这个弹出窗口由另一个名为ServerWindow 的类处理。它有一些字段,您可以在其中输入诸如端口号之类的内容,然后单击“确定”。单击确定后,ServerWindow 会将所有键入的信息发送到 Server 类。有一个名为 draw() 的 MainWindow 函数,其内容类似于:Graphics g = this.getGraphics();。
    • 可以在ServerWindow类的构造函数中传入对MainWindow对象的引用。然后在你传入的 MainWindow 对象上调用 draw() 函数。
    • 我相信这是因为调用 MainWindow 构造函数时没有任何内容可绘制到屏幕上,因此 getGraphics 返回 null。所以最好在创建ServerWindow的时候传入对MainWindow本身的引用,然后在ServerWindow类中需要的时候调用MainWindow实例上的getGraphics函数。
    • 连接应该运行在与Server / Client 的 GUI 线程 (MainWindow) 不同的线程上。那么将会发生的是Server 收到来自Client 的消息以移动方块,然后Server 的套接字线程将在Socket.receive() 调用中接收该消息。在服务器上运行套接字的线程然后向 GUI 线程发送消息以更新 GUI 的显示,然后继续侦听更多消息。
    • 您可以在Server 和Client 构造函数中传入对MainWindow 的引用,然后使用SwingUtilities.invokeLater() 更新MainWindow GUI。
    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多