有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将Java菜单栏操作swing到类

我的程序中有一个java菜单栏,只有一个选项和两个子选项,例如File->;保存,关闭。但我的选项不是保存和关闭,而是服务器和客户端。对于第一个选项的动作事件,我有一个java动作监听器:

public class serverAction extends AbstractAction
    {
        public serverAction()
        {
            super();
        }
        public void actionPerformed(ActionEvent e)
        {
            JOptionPane.showMessageDialog(null, "Test");
        }

    }

因此,当我点击文件时,它就起作用了->;服务器,它会弹出一个窗口,上面写着测试。现在我有了一个服务器类(我已经单独测试过,并且知道它可以工作),它看起来像这样:

public class SocketServer {

    public static void main(String[] args) 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() {
            ...
        }
    }
}

现在,当我点击主程序的服务器选项时,我需要调用这个SocketServer类,这样它就可以启动服务器代码,等待并监听任何客户端连接。我的问题是,如何从serverAction类开始整个SocketServer类代码


共 (1) 个答案

  1. # 1 楼答案

    你的nested-classesprivate,这意味着它只在ServerSocket类中可见。因此,您可以提供更具可见性的助手方法,或者更改更具可见性的类声明签名

    助手方法示例:

    public class SocketServer {
    .
    .
     //nested classes declaration    
     public static void startServer(){
       //code to start threads new SomeThread().start();
     }    
    }
    

    在你的行动中

    public class ServerAction extends AbstractAction{
            @Override
            public void actionPerformed(ActionEvent e){
                SocketServer.startServer();
                JOptionPane.showMessageDialog(null, "Test"); 
            }
    }
    

    如果你能在客户端连接时发出通知,那就太好了,诸如此类,我建议你看看SwingWorker,它提供了有用的工具来处理后台线程和gui线程之间的通知

    阅读更多:Worker threads and SwingWorker

    注意:如果你实现了Runnable那就太好了,而不是扩展线程,你没有向线程添加任何特殊功能。没有理由,这里有更多详细信息>"implements Runnable" vs. "extends Thread"