Java Applet GUI 在 Applet 完成下载之前不会显示

标签 java user-interface applet

我有一个使用 Swing 在 Eclipse 中编译的 Java Applet。参见这里:http://www.test.world2build.com/Game/Play.aspx

为了启动小程序,我创建了一个“正在加载...”对话框,用于登录并下载更新。该小程序包含三个类:

  • 主小程序
  • 加载对话框
  • 连接

MainApplet.class

public class MainApplet extends JApplet {
public MainApplet() {
}
public void init() {
    // constructor 

    setSize(800,600);
    getContentPane().setLayout(null);

    AppSettings AppSettings = new AppSettings();
    AppSettings.Username = GetParameter(0);
    AppSettings.Password = GetParameter(1);
    AppSettings.ClientMode = GetParameter(2);
    AppSettings.ServerIP = GetParameter(3);

    System.out.println("Main applet loaded.");
    System.out.println("Starting load...");

    LoadingDialog load = new LoadingDialog();
    load.setVisible(true);
    getContentPane().add(load);

    int panelX = (getWidth() - load.getWidth() - getInsets().left - getInsets().right) / 2;
    int panelY = ((getHeight() - load.getHeight() - getInsets().top - getInsets().bottom) / 2);
    load.setLocation(panelX, panelY);



    load.lblNewLabel_1.setText("Connecting...");

    //wait(2);

    // UPDATE PROGRESS BAR //
    load.progressBar.setValue(15);

    Connect connect = new Connect();
    String Result = null;
    try {
        Result = connect.Read("http://www.world2build.com/");
    } catch (IOException e) {
        e.printStackTrace();
    }

    if(Result == null) {
        return;
    }

    // UPDATE PROGRESS BAR //
    load.progressBar.setValue(30);

    load.lblNewLabel_1.setText("Checking for updates...");

    //wait(1);

    String UpdatesAvailable = "null";

    try {
        UpdatesAvailable = connect.Read("http://test.world2build.com/Game/CheckUpdates.aspx?v=" + AppSettings.Version);
    } catch (IOException e) {
        e.printStackTrace();
    }

    // UPDATE PROGRESS BAR //
    load.progressBar.setValue(60);

    if(UpdatesAvailable.startsWith("available")) {
        load.lblNewLabel.setText("Updating, please wait...");
        load.lblNewLabel_1.setText("Downloading...");

        URL url;
        try {
            url = new URL("http://www.world2build.com/Game/WorldToBuild.zip");

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            InputStream in = connection.getInputStream();
            FileOutputStream out = new FileOutputStream(System.getenv("APPDATA") + "download.zip");
            copy(in, out, 1024);
            out.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    else if(UpdatesAvailable.startsWith("unavailable")) {
        load.lblNewLabel.setText("Please wait...");
        load.lblNewLabel_1.setText("Logging in...");
        String loginStatus = null;

        try {
            loginStatus = connect.Read(
                    "http://test.world2build.com/Game/Login.ashx?u="
                    + AppSettings.Username + "&p="
                    + AppSettings.Password + "&sip="
                    + AppSettings.ServerIP);
        } catch (IOException e) {
            e.printStackTrace();
        }

        if(loginStatus.startsWith("success")) {
            load.lblNewLabel_1.setText("Connecting...");
            load.progressBar.setValue(100);

            // Join the game. Start game now. //


        }
        else if(loginStatus.startsWith("failed")) {
            load.lblNewLabel.setText("An error occured");
            load.lblNewLabel_1.setText("Login failed.");
        }
        else {
            load.lblNewLabel.setText("An error occured");
            load.lblNewLabel_1.setText("Failed to connect.");
        }
    }
    else {
        load.lblNewLabel.setText("An error occured");
        load.lblNewLabel_1.setText("Failed to check updates.");
    }
}
public static void copy(InputStream input, OutputStream output, int bufferSize) throws IOException {
    byte[] buf = new byte[bufferSize];
    int n = input.read(buf);
    while (n >= 0) {
      output.write(buf, 0, n);
      n = input.read(buf);
    }
    output.flush();
 }
 public static void wait(int n){
    long t0, t1;
    t0 =  System.currentTimeMillis();
    do{
        t1 = System.currentTimeMillis();
    }
    while ((t1 - t0) < (n * 1000));
}
public String GetParameter(int Index) {
    String Parameters = null;
    String[] Stuff = null; 

    try {
        Parameters = this.getParameter("data");
        Stuff = Parameters.split(" ");

        return Stuff[Index];
    } catch(NullPointerException e) {
        e.printStackTrace();
    }

    // Username         Password        ServerMode       IP
    Parameters = "Bailey 1f6311d6446e2a3fa08a1c08187129ad false 127.0.0.1:45565";
    Stuff = Parameters.split(" ");

    return Stuff[Index];
} }

LoadingDialog.class

public class LoadingDialog extends JApplet {

public JPanel frame = new JPanel();

public JProgressBar progressBar;
public JLabel lblNewLabel_1;
public JLabel lblNewLabel;
private JPanel panel;

public LoadingDialog() {
    getContentPane().setFocusable(false);
    frame.setBorder(new LineBorder(new Color(0, 0, 0)));
    setSize(350,150);
    frame.setSize(350,150);
    getContentPane().setLayout(null);
    setVisible(true);
    progressBar = new JProgressBar();
    progressBar.setVerifyInputWhenFocusTarget(false);
    progressBar.setOpaque(true);
    progressBar.setBounds(10, 51, 322, 19);
    getContentPane().add(progressBar);

    lblNewLabel = new JLabel("Please wait...");
    lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 14));
    lblNewLabel.setBounds(24, 11, 308, 29);
    getContentPane().add(lblNewLabel);

    lblNewLabel_1 = new JLabel("Checking for updates...");
    lblNewLabel_1.setForeground(UIManager.getColor("InternalFrame.borderDarkShadow"));
    lblNewLabel_1.setHorizontalAlignment(SwingConstants.RIGHT);
    lblNewLabel_1.setHorizontalTextPosition(SwingConstants.RIGHT);
    lblNewLabel_1.setBounds(10, 76, 322, 19);
    getContentPane().add(lblNewLabel_1);



    int panelX = (getWidth() - frame.getWidth() - getInsets().left - getInsets().right) / 2;
    int panelY = ((getHeight() - frame.getHeight() - getInsets().top - getInsets().bottom) / 2);
    frame.setBounds(350, 150, panelX, panelY);

    frame.setVisible(true);
} }

出于某种奇怪的原因,在使用 Connect 类获取 URL 内容的 MainApplet 中(见下文),Applet 在所有完成之前不会显示 LoadingDialog GUI。

Connect.class

public class Connect {
public String Read(String theurl) throws IOException {
    URL url = new URL(theurl);

    // Read all the text returned by the server
    BufferedReader in;
    try {
        in = new BufferedReader(new InputStreamReader(url.openStream()));
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
    String str = in.readLine();
    String newstr = "...";

    while(newstr != null) {
        newstr = in.readLine();
        if(newstr == null) {
            break;
        }
        else {
            str += newstr;
        }
    }

    in.close();
    return str;
} }

最佳答案

您的 Connect 类使用阻塞 I/O,这会阻止 init 方法在所有内容下载完成之前完成。至少在 init 方法返回之后,Applet 才会呈现。为了让 init 方法快速返回,您可以将资源下载卸载到后台工作线程。

例如,参见 SwingWorker ,这是一个实用程序类,旨在帮助在 Swing GUI 中正确执行此类工作线程卸载。它是在 Java 6 中作为标准 Java 的一部分引入的。如果您需要支持 Java 5,可以找到 SwingWorker for download 的早期版本。 .


或者,您可以生成自己的线程。只需确保将 GUI 更新推送到 AWT 事件调度线程即可。

public class MainApplet extends JApplet {
    public MainApplet() {
    }
    public void init() {
        // constructor 

        setSize(800,600);
        getContentPane().setLayout(null);

        AppSettings AppSettings = new AppSettings();
        AppSettings.Username = GetParameter(0);
        AppSettings.Password = GetParameter(1);
        AppSettings.ClientMode = GetParameter(2);
        AppSettings.ServerIP = GetParameter(3);

        System.out.println("Main applet loaded.");
        System.out.println("Starting load...");

        final LoadingDialog load = new LoadingDialog();
        load.setVisible(true);
        getContentPane().add(load);

        int panelX = (getWidth() - load.getWidth() - getInsets().left - getInsets().right) / 2;
        int panelY = ((getHeight() - load.getHeight() - getInsets().top - getInsets().bottom) / 2);
        load.setLocation(panelX, panelY);

        load.lblNewLabel_1.setText("Connecting...");

        // UPDATE PROGRESS BAR //
        load.progressBar.setValue(15);

        Thread thread = new Thread() {
            public void run() {
                Connect connect = new Connect();
                String Result = null;
                try {
                    Result = connect.Read("http://www.world2build.com/");
                } catch (IOException e) {
                    e.printStackTrace();
                }

                if(Result == null) {
                    return;
                }

                // UPDATE PROGRESS BAR //
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        load.progressBar.setValue(30);
                        load.lblNewLabel_1.setText("Checking for updates...");
                    }
                });

                String UpdatesAvailable = "null";

                try {
                    UpdatesAvailable = connect.Read("http://test.world2build.com/Game/CheckUpdates.aspx?v=" + AppSettings.Version);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                // UPDATE PROGRESS BAR //
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        load.progressBar.setValue(60);
                    }
                });

                if(UpdatesAvailable.startsWith("available")) {
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            load.lblNewLabel.setText("Updating, please wait...");
                            load.lblNewLabel_1.setText("Downloading...");
                        }
                    });

                    URL url;
                    try {
                        url = new URL("http://www.world2build.com/Game/WorldToBuild.zip");

                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                        connection.setRequestMethod("GET");
                        InputStream in = connection.getInputStream();
                        FileOutputStream out = new FileOutputStream(System.getenv("APPDATA") + "download.zip");
                        copy(in, out, 1024);
                        out.close();
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (ProtocolException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                else if(UpdatesAvailable.startsWith("unavailable")) {
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            load.lblNewLabel.setText("Please wait...");
                            load.lblNewLabel_1.setText("Logging in...");
                        }
                    });
                    String loginStatus = null;

                    try {
                        loginStatus = connect.Read(
                                "http://test.world2build.com/Game/Login.ashx?u="
                                + AppSettings.Username + "&p="
                                + AppSettings.Password + "&sip="
                                + AppSettings.ServerIP);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    if(loginStatus.startsWith("success")) {
                        SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                load.lblNewLabel_1.setText("Connecting...");
                                load.progressBar.setValue(100);
                            }
                        });

                        // Join the game. Start game now. //


                    }
                    else if(loginStatus.startsWith("failed")) {
                        SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                load.lblNewLabel.setText("An error occured");
                                load.lblNewLabel_1.setText("Login failed.");
                            }
                        });
                    }
                    else {
                        SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                load.lblNewLabel.setText("An error occured");
                                load.lblNewLabel_1.setText("Failed to connect.");
                            }
                        });
                    }
                }
                else {
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            load.lblNewLabel.setText("An error occured");
                            load.lblNewLabel_1.setText("Failed to check updates.");
                        }
                    }

                }
            }

            Connect connect = new Connect();
            String Result = null;
            try {
                Result = connect.Read("http://www.world2build.com/");
            } catch (IOException e) {
                e.printStackTrace();
            }

            if(Result == null) {
                return;
            }

            // UPDATE PROGRESS BAR //
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    load.progressBar.setValue(30);
                    load.lblNewLabel_1.setText("Checking for updates...");
                }
            });

            //wait(1);

            String UpdatesAvailable = "null";

            try {
                UpdatesAvailable = connect.Read("http://test.world2build.com/Game/CheckUpdates.aspx?v=" + AppSettings.Version);
            } catch (IOException e) {
                e.printStackTrace();
            }

            // UPDATE PROGRESS BAR //
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    load.progressBar.setValue(60);
                }
            });

            if(UpdatesAvailable.startsWith("available")) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        load.lblNewLabel.setText("Updating, please wait...");
                        load.lblNewLabel_1.setText("Downloading...");
                    }
                });

                URL url;
                try {
                    url = new URL("http://www.world2build.com/Game/WorldToBuild.zip");

                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    InputStream in = connection.getInputStream();
                    FileOutputStream out = new FileOutputStream(System.getenv("APPDATA") + "download.zip");
                    copy(in, out, 1024);
                    out.close();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (ProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            else if(UpdatesAvailable.startsWith("unavailable")) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        load.lblNewLabel.setText("Please wait...");
                        load.lblNewLabel_1.setText("Logging in...");
                    }
                });
                String loginStatus = null;

                try {
                    loginStatus = connect.Read(
                            "http://test.world2build.com/Game/Login.ashx?u="
                            + AppSettings.Username + "&p="
                            + AppSettings.Password + "&sip="
                            + AppSettings.ServerIP);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                if(loginStatus.startsWith("success")) {
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            load.lblNewLabel_1.setText("Connecting...");
                            load.progressBar.setValue(100);
                        }
                    });

                    // Join the game. Start game now. //


                }
                else if(loginStatus.startsWith("failed")) {
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            load.lblNewLabel.setText("An error occured");
                            load.lblNewLabel_1.setText("Login failed.");
                        }
                    });
                }
                else {
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            load.lblNewLabel.setText("An error occured");
                            load.lblNewLabel_1.setText("Failed to connect.");
                        }
                    });
                }
            }
            else {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        load.lblNewLabel.setText("An error occured");
                        load.lblNewLabel_1.setText("Failed to check updates.");
                    }
                });
            }
        }
        thread.start();
    }
    // ...
}

关于Java Applet GUI 在 Applet 完成下载之前不会显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689349/

相关文章:

Java/安卓 : Continuously rotate ImageView image on tap of left/right side of screen

java - 如何通过RMI移动对象?

css - 没有 "breaking"复制和粘贴的智能报价?

c# - 让用户输入格式正确的 URL 的最佳方式?

Java3D 在小程序中绘制空的白色窗口

java - 在不迭代的情况下创建与另一个大小相同的多数组的快速方法?

java - Netty 使用 TCP 给我一个错误的端口

c++ - 错误 C2664 : 'CComboBox::InsertString' : cannot convert parameter 2 from 'const char [4]' to 'LPCTSTR'

java - 需要将字节数组转换为图像而不使用 imageIO 或 fileoutputstream

java - 不断收到 "java.security.AccessControlException access denied:"错误