Java GUI构造函数被调用两次致双窗口弹出问题求助
解决GUI构造函数被调用两次的问题
问题根源
Servidor是继承自RummyClient的静态内部类,当你在main方法中创建Servidor实例时,会触发父类RummyClient的成员初始化,执行public GUI gui = new GUI();,生成第一个窗口。- 紧接着你又创建了
RummyClient的实例并启动线程,这会再次执行public GUI gui = new GUI();,生成第二个窗口。
解决方案
方案一:将GUI实例改为静态单例
把RummyClient中的gui成员改为静态,确保全局只初始化一次:
public class RummyClient implements Runnable{ // 改为静态单例,仅初始化一次 public static GUI gui = new GUI(); public static Servidor servidor; // 后续代码保持不变... }
方案二:让Servidor不再继承RummyClient
调整Servidor的结构,避免不必要的继承关系:
public class RummyClient implements Runnable{ public GUI gui = new GUI(); public static Servidor servidor; public static void main(String[] args) throws UnknownHostException, IOException { RummyClient client = new RummyClient(); servidor = new Servidor(25565, "localhost", client); new Thread(client).start(); } @Override public void run() { while(true) { gui.repaint(); } } // GUI类代码保持不变... // 修改Servidor,不再继承RummyClient static class Servidor { Socket s; PrintWriter out; Scanner in; private RummyClient client; public Servidor(int port, String ip, RummyClient client) throws UnknownHostException, IOException { this.client = client; this.s = new Socket(ip, port); this.out = new PrintWriter(s.getOutputStream()); this.in = new Scanner(s.getInputStream()); Thread input = new Thread(new Input()); input.start(); } public void send(String text) { out.println(text); out.flush(); } class Input implements Runnable { @Override public void run() { while(true) { String incoming = in.nextLine(); switch (incoming) { case "ready": client.gui.start(); break; } } } } } }
内容的提问来源于stack exchange,提问作者user21102712
相关产品推荐
相关产品推荐

