通过 RMI 传递 JFrame: isShowing() 在客户端上返回 false,但在服务器上返回 true



谁能解释为什么下面的代码打印这个?服务器:真客户端:假

isShowing()只是 Component 中定义的布尔值的 getter - 不应该正确序列化吗?

嘟.java嘟嘟

��
public interface RMIInterface extends Remote {
    public JFrame getJFrame() throws RemoteException;
}

RMIClient.java

public class RMIClient {
    public static void main(String args[]) throws Exception {
        Registry registry = LocateRegistry.getRegistry(1099);
        RMIInterface server = (RMIInterface) registry.lookup("myService");
        JFrame frame = server.getJFrame();
        System.out.println("Client: " + frame.isShowing());
    }
}

RMIServer.java

public class RMIServer implements RMIInterface {
    private JFrame frame;
    protected RMIServer() {
        createAndShowGUI();
    }
    private void createAndShowGUI() {
        frame = new JFrame("FrameDemo");
        frame.pack();
        frame.setVisible(true);
    }
    @Override
    public JFrame getJFrame() {
        System.out.println("Server: " + frame.isShowing());
        return frame;
    }
    public static void main(String[] args) throws Exception {
        Registry registry = LocateRegistry.createRegistry(1099);
        RMIServer server = new RMIServer();
        RMIInterface stub = (RMIInterface)UnicastRemoteObject.exportObject(server, 0);
        registry.bind("myService", stub);
    }
}

你混淆了isShowing()isVisible(). visible只是一个boolean属性,但showing意味着实际上显示在屏幕上,并且AWT组件在刚刚反序列化时永远不会显示。反序列化后,您必须在组件层次结构的Window祖先(即JFrame)上调用setVisible(true)才能显示。


只需考虑Component.isShowing()

确定此组件是否显示在屏幕上。这意味着组件必须是可见的,并且必须位于可见且显示的容器中。

Window.isShowing()

检查此窗口是否显示在屏幕上。

最新更新