Java не мой родной язык, и я немного борюсь с этой проблемой.Applets - init(), EDT и темы
В принципе, я нахожу поведенческую разницу между вызовом метода switchApplets() непосредственно из init() и вызывая его из нового потока, порожденного init().
Последствием вызова изнутри нового потока является то, что новые апплетские whitescreens - до тех пор, пока пользователь не изменит размер или не минимизирует их браузер. Если вызывается в конце init(), новый пользовательский интерфейс отображает сразу без ввода пользователем. Но это не вариант, потому что он не ждет, пока поток завершит свою подготовительную работу.
код подстриженные-вниз:
public class PreLoader extends Applet implements AppletStub {
static JProgressBar pBar = null;
static JLabel message;
public void switchApplets() {
try {
Class main_class = Class.forName("MainClass");
Applet main_applet = (Applet)main_class.newInstance();
removeAll();
setSize(0,0);
setLayout(new GridLayout(1,0));
add(main_applet);
main_applet.init();
main_applet.start();
main_applet.setStub(this);
}
catch (Exception e) {
}
}
public void init() {
pBar = new JProgressBar(0, 100);
pBar.setValue(0);
pBar.setStringPainted(true);
message = new JLabel("Beginning work!");
add(message);
add(pBar);
FlowLayout flow = new FlowLayout();
setLayout(flow);
Thread t = new Thread (new Runnable() {
public void run()
{
longRunningFunction1();
longRunningFunction2();
message.setText("Work complete! Stand by..");
switchApplets(); //does NOT work as intended from here
return;
}
});
t.start();
//switchApplets(); //works as intended if called HERE
}
public void longRunningFunction1() {
//perform some tasks, advance progress bar
}
public void longRunningFunction2() {
//perform some tasks, advance progress bar
}
public void start() {
return;
}
public void appletResize(int width, int height) {
return;
}
}
Я попытался сделать Init() ждать завершения потока, так что я мог бы назвать switchApplets() оттуда, но только блокировала EDT и предотвратить UI от обновление. Также попытался сыграть с SwingUtilities invokeLater/invokeAndWait, но даже если switchApplets() запускается на EDT, кажется, что он ДОЛЖЕН быть вызван непосредственно из init() (или, по крайней мере, инициализация потока работает), чтобы иметь желаемый эффект ,
Почему вызов switchApplets() из новой строки приводит к слегка отличающемуся (и нежелательному) поведению пользовательского интерфейса?
Тем временем (или, возможно, постоянно) Я создаю новый класс из init(), который запускает JFrame в новом потоке и ждет его закрытия. – Eric