Java 如何使jprogressbar与我的算法并行运行
可能重复:Java 如何使jprogressbar与我的算法并行运行,java,swing,jprogressbar,Java,Swing,Jprogressbar,可能重复: 我正在使用Netbeans拖放来做一个应用程序。我将从用户那里获取输入,并使用输入运行我的算法。该算法将花费不同的时间运行,然后在新的帧中显示其结果。在等待算法运行时,我希望添加一个进度条。 当用户单击按钮提交输入时,我添加了下面的代码 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { final JProgressBar bar = new JProgressBa
我正在使用Netbeans拖放来做一个应用程序。我将从用户那里获取输入,并使用输入运行我的算法。该算法将花费不同的时间运行,然后在新的帧中显示其结果。在等待算法运行时,我希望添加一个进度条。 当用户单击按钮提交输入时,我添加了下面的代码
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
final JProgressBar bar = new JProgressBar(0,250000);
bar.setValue(1000);
bar.setIndeterminate(false);
JOptionPane jO = new JOptionPane(bar);
Thread th = new Thread(){
public void run(){
for(int i = 1000 ; i < 250000 ; i+=10000){
bar.setValue(i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
};
th.start();
final JDialog dialog = jO.createDialog(jO,"Experiment X");
dialog.pack();
dialog.setVisible(true);
//Algorithm goes here
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){
最终JProgressBar=新JProgressBar(025000);
bar.设定值(1000);
bar.setUndeterminate(假);
JOptionPane jO=新的JOptionPane(条);
Thread th=新线程(){
公开募捐{
对于(int i=1000;i<250000;i+=10000){
bar.设定值(i);
试一试{
睡眠(100);
}捕捉(中断异常e){
}
}
}
};
th.start();
最终JDialog dialog=jO.createDialog(jO,“实验X”);
dialog.pack();
对话框.setVisible(true);
//算法在这里
progressbar确实会显示并运行。但当进度条值更新到最后时,只有我的算法运行。我看穿了其他示例,但我并不真正理解它是如何工作的
有人能告诉我哪里出错了吗?Swing中一些最重要的概念是 不要在事件调度线程(ETD)中执行任何长时间运行/阻塞操作。这将导致UI显示为“冻结”且无响应。好的是,您似乎理解这一点 不要从EDT以外的任何线程创建或修改任何ui组件。你没有这样做 您最好的行动原因是利用,这允许您执行长时间运行的操作,同时向侦听器提供进度反馈
public class TestProgress {
public static void main(String[] args) {
new TestProgress();
}
public TestProgress() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
ProgressPane progressPane = new ProgressPane();
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(progressPane);
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
// progressPane.doWork();
}
});
}
public class ProgressPane extends JPanel {
private JProgressBar progressBar;
private JButton startButton;
public ProgressPane() {
setLayout(new GridBagLayout());
progressBar = new JProgressBar();
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
add(progressBar, gbc);
startButton = new JButton("Start");
gbc.gridy = 1;
add(startButton, gbc);
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startButton.setEnabled(false);
doWork();
}
});
}
public void doWork() {
Worker worker = new Worker();
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
worker.execute();
}
public class Worker extends SwingWorker<Object, Object> {
@Override
protected void done() {
startButton.setEnabled(true);
}
@Override
protected Object doInBackground() throws Exception {
for (int index = 0; index < 1000; index++) {
int progress = Math.round(((float) index / 1000f) * 100f);
setProgress(progress);
Thread.sleep(10);
}
return null;
}
}
}
}
公共类测试进度{
公共静态void main(字符串[]args){
新测试进展();
}
公共测试进展(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}捕获(ClassNotFoundException ex){
}catch(实例化异常){
}捕获(非法访问例外){
}捕获(无支持的LookandFeelexception ex){
}
ProgressPane ProgressPane=新建ProgressPane();
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(进程窗格);
框架。设置尺寸(200200);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
//progressPane.doWork();
}
});
}
公共类ProgressPane扩展了JPanel{
私人JProgressBar progressBar;
私有JButton开始按钮;
公共进度窗格(){
setLayout(新的GridBagLayout());
progressBar=新的JProgressBar();
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridx=0;
gbc.gridy=0;
添加(进度条,gbc);
startButton=新的JButton(“开始”);
gbc.gridy=1;
添加(启动按钮,gbc);
addActionListener(新ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
startButton.setEnabled(错误);
销钉();
}
});
}
公共工作{
工人=新工人();
worker.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共作废属性更改(属性更改事件evt){
if(“progress”.equals(evt.getPropertyName())){
progressBar.setValue((整数)evt.getNewValue());
}
}
});
worker.execute();
}
公共类Worker扩展SwingWorker{
@凌驾
受保护的void done(){
startButton.setEnabled(真);
}
@凌驾
受保护对象doInBackground()引发异常{
对于(int-index=0;index<1000;index++){
整数进度=数学四舍五入((浮动)指数/1000f)*100f);
设定进度(进度);
睡眠(10);
}
返回null;
}
}
}
}
你的另一个选择是使用,或者,如果你真的很绝望,使用,但是,我真的鼓励你使用
SwingWorker
;)Swing中一些最重要的概念是
不要在事件调度线程(ETD)中执行任何长时间运行/阻塞操作。这将导致UI显示为“冻结”且无响应。好的是,您似乎理解这一点
不要从EDT以外的任何线程创建或修改任何ui组件。你没有这样做
您最好的行动原因是利用,这允许您执行长时间运行的操作,同时向侦听器提供进度反馈
public class TestProgress {
public static void main(String[] args) {
new TestProgress();
}
public TestProgress() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
ProgressPane progressPane = new ProgressPane();
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(progressPane);
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
// progressPane.doWork();
}
});
}
public class ProgressPane extends JPanel {
private JProgressBar progressBar;
private JButton startButton;
public ProgressPane() {
setLayout(new GridBagLayout());
progressBar = new JProgressBar();
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
add(progressBar, gbc);
startButton = new JButton("Start");
gbc.gridy = 1;
add(startButton, gbc);
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startButton.setEnabled(false);
doWork();
}
});
}
public void doWork() {
Worker worker = new Worker();
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
worker.execute();
}
public class Worker extends SwingWorker<Object, Object> {
@Override
protected void done() {
startButton.setEnabled(true);
}
@Override
protected Object doInBackground() throws Exception {
for (int index = 0; index < 1000; index++) {
int progress = Math.round(((float) index / 1000f) * 100f);
setProgress(progress);
Thread.sleep(10);
}
return null;
}
}
}
}
公共类测试进度{
公共静态void main(字符串[]args){
新测试进展();
}
公共测试进展(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}捕获(ClassNotFoundException ex){