Графический интерфейс Java-апплета не отображается, пока апплет не завершит загрузку - PullRequest
2 голосов
/ 13 марта 2012

У меня есть Java-апплет, скомпилированный в Eclipse с использованием Swing.Смотрите здесь: http://www.test.world2build.com/Game/Play.aspx

Для запуска апплета я создал диалог «Загрузка ...», в котором можно было бы войти и загрузить обновления.Этот апплет содержит три класса:

  • MainApplet
  • LoadingDialog
  • Connect

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

По какой-то странной причине в MainApplet, где он получает содержимое URL-адресов с помощью класса Connect (см. Ниже), апплетне показывает GUI LoadingDialog, пока все не будет завершено.

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;
} }

1 Ответ

2 голосов
/ 13 марта 2012

Ваш класс Connect использует блокирующий ввод / вывод, что препятствует завершению метода init до тех пор, пока все не будет загружено. Апплет не будет отображаться до тех пор, пока не вернется метод init. Чтобы метод init мог быстро возвращаться, вы можете перенести загрузку ресурсов в фоновый рабочий поток.

См., Например, SwingWorker , который представляет собой служебный класс, предназначенный для правильной выгрузки такого типа рабочих потоков в графическом интерфейсе Swing. Он был представлен как часть стандартной Java в Java 6. Если вам нужна поддержка Java 5, вы можете найти более ранние версии SwingWorker для загрузки .


В качестве альтернативы вы можете создать свою собственную ветку. Обязательно вставляйте обновления графического интерфейса в поток рассылки событий 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();
    }
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...