使用javax.swing.ProgressMonitor时如何禁用取消按钮?

时间:2009-02-04 16:33:11

标签: java swing

我想使用ProgressMonitor的功能,但我不想让用户选择取消操作。我知道如果我不打电话isCanceled()那么按下按钮没有效果,但我不希望让用户认为该节目没有响应。

我该如何做到这一点?

4 个答案:

答案 0 :(得分:3)

你做不到。使用JProgressBar创建自己的对话框,如The Java Tutorial

中所述

答案 1 :(得分:3)

我不知道为什么所有ProgressMonitor字段都是私有的。可能不是Godsling先生最骄傲的创作:)

 * @author James Gosling
 * @author Lynn Monsanto (accessibility) 
 * @version 1.37 04/12/06

只需克隆它,以及来自Swing的一些软件包私有东西,然后你可以做任何你想做的事情,比如为可取消性添加一个标志,并在ProgressOptionPane的构造函数中使用它。


(更新)如果您无法在SCSL下导出JDK代码,那么这是一种获取JDialog的狡猾方法,那么您可以执行任何操作,包括删除“取消”按钮:

progressMonitor = new ProgressMonitor(ProgressMonitorDemo.this,
                                     "Running a Long Task",
                                     "", 0, 100);
progressMonitor.setMillisToDecideToPopup(0);
progressMonitor.setMillisToPopup(0);
progressMonitor.setProgress(0);
JDialog dialog = (JDialog)progressMonitor.getAccessibleContext().getAccessibleParent();
JOptionPane pane = (JOptionPane)dialog.getContentPane().getComponent(0);
pane.setOptions(new Object[]{});

这很难看,它完全依赖于ProgressMonitor的实现。所以你应该检查ClassCastException和null。

为什么需要将两个时间段都设置为0?否则,不会在setProgress中创建对话框。

答案 2 :(得分:1)

我知道这篇文章有点陈旧,但谷歌的第一个答案,所以我会发布我的答案......

我没有禁用取消按钮的解决方案,但我使用此提示:点击取消时重新显示进度监视器。

public void propertyChange (PropertyChangeEvent event) {
    if (event.getPropertyName().equals("progress")) {
        int progress = ((Integer) event.getNewValue()).intValue();
        lastProgress = progress;
        progressMonitor.setProgress(progress);
    }
    if (progressMonitor.isCanceled()) {
        progressMonitor = new ProgressMonitor(panel, "", "", 0, 100);
        progressMonitor.setMillisToDecideToPopup(0);
        progressMonitor.setMillisToPopup(0);
        progressMonitor.setProgress(lastProgress);
    }
}

当然,你必须记住最后的进展值。

这个解决方案有点过时,但对我来说很有用。

伊夫

答案 3 :(得分:0)

第一个问题是为什么您不希望用户能够取消操作?如果花了这么长时间,他们为什么不能决定他们不想等待呢?

如果你真的不想要取消按钮,你必须咬紧牙关并创建自己的进度对话框。您可以查看ProgressMonitor来源,了解他们是如何做到的(他们使用JOptionPane进行对话,并将其传递给StringsJProgressBar几个。< / p>