gpt4 book ai didi

在小程序完成下载之前,Java 小程序 GUI 不会显示

转载 作者:行者123 更新时间:2023-11-30 09:39:48 32 4
gpt4 key购买 nike

我有一个使用 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。

连接类

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 事件分派(dispatch)线程即可。

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 小程序 GUI 不会显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689349/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com