我使用Swing在Eclipse中编译了一个Java Applet。见这里:http://www.test.world2build.com/Game/Play.aspx
为了启动applet,我创建了一个“Loading ...”对话框,可以登录和下载更新。这个小程序包含三个类:
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中,它使用Connect类获取URL的内容(见下文),在完成所有操作之前,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;
} }
答案 0 :(得分:2)
您的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();
}
// ...
}