谁能解释为什么下面的代码打印这个?服务器:真客户端:假
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()
:
检查此窗口是否显示在屏幕上。