一旦线程 returns true 继续
Continue once the thread returns true
在线程完成之前,我无法将我的代码发送到 'pause'。我的程序只是一个框架内的 JProgressBar。我正在使用一个位于线程内的循环,它每 10 毫秒循环一次并将 +1 添加到进度条。随着值从 0 增加到 100,最终结果将使条形看起来充满活力。
现在,问题是将代码设置为 'wait',直到进度条达到值 100。如您在代码中所见,我只想重新启用按钮 当进度条达到值 100 时。截至目前,随着进度条的增加,按钮似乎同时重新启用。
disableButtons();
// loop and animate the progress bar
for (int i = 0; i <= 100; i++) {
Game.setProgBar_loading(i);
// wait a number of milliseconds
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
enableButtons();
我不太明白为什么在没有同时执行并行操作的情况下需要使用线程来动画进度条。
Thread class 中的 join 方法在线程执行终止之前处于阻塞状态。
...
Thread animatedProgressBarThread = new Thread(thread);
animatedProgressBarThread.start();
// next line blocks until thread terminates its execution
animatedProgressBarThread.join();
运行 方法 Loading class 使用 Catch 块忽略 InterruptedException。根据文档,创建的线程将不可中断。 catch 块应将线程的状态设置为中断并终止。
为什么不在加载栏达到 100% 后才启用按钮?您可以通过回调来完成,也可以将相关代码放在 setProgressBar
方法
中
// set the progress bar's value
public static void setProgressBar(int num) {
loadingBar.setValue(num);
if(num >=100){
// <TODO> re-enable all buttons
}
}
您可以将 Loading
class 嵌套在 Program
中,然后从那里访问 Program
的变量,然后几乎复制这部分代码:// <TODO> re-enable all buttons
进入循环结束。像这样:
class Program {
// assuming you have these buttons:
private JButton button1;
private JButton button2;
private JButton button3;
// snip
public Program() {
// assuming there's initialization code for the above buttons somewhere...
// button1 = new ...
// button2 = new ...
// button3 = new ...
// frame initializing
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setBounds(100, 100, 890, 480);
getContentPane().setLayout(null);
setVisible(true);
// create the loading bar
loadingBar = new JProgressBar();
loadingBar.setBounds(10, 11, 864, 23);
getContentPane().add(loadingBar);
// <TODO> disable all buttons
button1.setEnabled(false);
button2.setEnabled(false);
button3.setEnabled(false);
// animate the loading bar
Loading thread = new Loading();
new Thread(thread).start();
// do not re-enable the buttons here yet.
}
// snip
public class Loading implements Runnable {
@Override
public void run() {
// loop and increment loading bar's value
for (int i = 0; i <= 100; i++) {
Program.setProgressBar(i);
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
// re-enable the buttons here instead
button1.setEnabled(true);
button2.setEnabled(true);
button3.setEnabled(true);
}
}
}
编辑: 要概括您的 Loading
class 并在以后重用它,您可以创建一个包含方法的接口,例如 beforeExecute()
和afterExecute()
。将该接口作为 Loading
构造函数的参数并将其保存为成员,以便稍后可以从 run()
:
中调用接口的方法
public interface LoadingHandler {
public void beforeExecute();
public void afterExecute();
}
public class Loading implements Runnable {
private LoadingHandler handler;
public Loading(LoadingHandler handler) {
this.handler = handler;
}
@Override
public void run() {
// disableButtons();
// use interface's methods instead:
handler.beforeExecute();
// loop and animate the progress bar
for (int i = 0; i <= 100; i++) {
Game.setProgBar_loading(i);
// wait a number of milliseconds
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
// enableButtons();
// use interface's method instead:
handler.afterExecute();
}
}
然后,在您的 GUI 线程中,您将执行如下操作:
Loading thread = new Loading(new LoadingHandler() {
@Override
public void beforeExecute() {
disableButtons();
}
@Override
public void afterExecute() {
enableButtons();
}
});
new Thread(thread).start();
在线程完成之前,我无法将我的代码发送到 'pause'。我的程序只是一个框架内的 JProgressBar。我正在使用一个位于线程内的循环,它每 10 毫秒循环一次并将 +1 添加到进度条。随着值从 0 增加到 100,最终结果将使条形看起来充满活力。
现在,问题是将代码设置为 'wait',直到进度条达到值 100。如您在代码中所见,我只想重新启用按钮 当进度条达到值 100 时。截至目前,随着进度条的增加,按钮似乎同时重新启用。
disableButtons();
// loop and animate the progress bar
for (int i = 0; i <= 100; i++) {
Game.setProgBar_loading(i);
// wait a number of milliseconds
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
enableButtons();
我不太明白为什么在没有同时执行并行操作的情况下需要使用线程来动画进度条。
Thread class 中的 join 方法在线程执行终止之前处于阻塞状态。
...
Thread animatedProgressBarThread = new Thread(thread);
animatedProgressBarThread.start();
// next line blocks until thread terminates its execution
animatedProgressBarThread.join();
运行 方法 Loading class 使用 Catch 块忽略 InterruptedException。根据文档,创建的线程将不可中断。 catch 块应将线程的状态设置为中断并终止。
为什么不在加载栏达到 100% 后才启用按钮?您可以通过回调来完成,也可以将相关代码放在 setProgressBar
方法
// set the progress bar's value
public static void setProgressBar(int num) {
loadingBar.setValue(num);
if(num >=100){
// <TODO> re-enable all buttons
}
}
您可以将 Loading
class 嵌套在 Program
中,然后从那里访问 Program
的变量,然后几乎复制这部分代码:// <TODO> re-enable all buttons
进入循环结束。像这样:
class Program {
// assuming you have these buttons:
private JButton button1;
private JButton button2;
private JButton button3;
// snip
public Program() {
// assuming there's initialization code for the above buttons somewhere...
// button1 = new ...
// button2 = new ...
// button3 = new ...
// frame initializing
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setBounds(100, 100, 890, 480);
getContentPane().setLayout(null);
setVisible(true);
// create the loading bar
loadingBar = new JProgressBar();
loadingBar.setBounds(10, 11, 864, 23);
getContentPane().add(loadingBar);
// <TODO> disable all buttons
button1.setEnabled(false);
button2.setEnabled(false);
button3.setEnabled(false);
// animate the loading bar
Loading thread = new Loading();
new Thread(thread).start();
// do not re-enable the buttons here yet.
}
// snip
public class Loading implements Runnable {
@Override
public void run() {
// loop and increment loading bar's value
for (int i = 0; i <= 100; i++) {
Program.setProgressBar(i);
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
// re-enable the buttons here instead
button1.setEnabled(true);
button2.setEnabled(true);
button3.setEnabled(true);
}
}
}
编辑: 要概括您的 Loading
class 并在以后重用它,您可以创建一个包含方法的接口,例如 beforeExecute()
和afterExecute()
。将该接口作为 Loading
构造函数的参数并将其保存为成员,以便稍后可以从 run()
:
public interface LoadingHandler {
public void beforeExecute();
public void afterExecute();
}
public class Loading implements Runnable {
private LoadingHandler handler;
public Loading(LoadingHandler handler) {
this.handler = handler;
}
@Override
public void run() {
// disableButtons();
// use interface's methods instead:
handler.beforeExecute();
// loop and animate the progress bar
for (int i = 0; i <= 100; i++) {
Game.setProgBar_loading(i);
// wait a number of milliseconds
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
}
// enableButtons();
// use interface's method instead:
handler.afterExecute();
}
}
然后,在您的 GUI 线程中,您将执行如下操作:
Loading thread = new Loading(new LoadingHandler() {
@Override
public void beforeExecute() {
disableButtons();
}
@Override
public void afterExecute() {
enableButtons();
}
});
new Thread(thread).start();