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

时间:2014-02-14 14:44:53

标签: java swing rmi

任何人都可以解释为什么以下代码打印出这个?: 服务器:是的 客户:假

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

RMIInterface.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);
    }
}

1 个答案:

答案 0 :(得分:0)

您正在混淆isShowing()isVisible()visible只是boolean属性,但showing暗示实际显示在屏幕上,并且AWT组件在它们被反序列化时从不显示。您必须在反序列化后在组件层次结构的setVisible(true)祖先(即Window)上调用JFrame才能显示它。


只需考虑Component.isShowing()

  

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

Window.isShowing()

  

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