【问题标题】:Progress bar Java doesn't update进度条 Java 不更新
【发布时间】:2015-08-11 05:41:31
【问题描述】:

我已经尝试了很多这里列出的教程和示例,但不适用于我,我认为这是因为我使用 netbeans。

我试过了:

让我展示我的代码。

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    vet = new int[Integer.valueOf(tamVet.getText())];
    ordenado = new int[Integer.valueOf(tamVet.getText())];
    metUtilizado = (String) CBMetodo.getSelectedItem();
    if (CBMetodo.getSelectedItem() == "Ordenado") {
        for (int i = 0; i < Integer.valueOf(tamVet.getText()); i++) {
            vet[i] = i;
        }
    } else if (CBMetodo.getSelectedItem() == "Reverso") {
        for (int i = 0; i < Integer.valueOf(tamVet.getText()); i++) {
            vet[i] = -i;
        }
    } else if (CBMetodo.getSelectedItem() == "Aleatório") {
        Random randomGenerator = new Random();
        for (int i = 0; i < Integer.valueOf(tamVet.getText()); i++) {
            vet[i] = randomGenerator.nextInt(Integer.valueOf(tamVet.getText()));
        }
    }
    vetList.clear();

    for (int i = 0; i < vet.length; i++) {
        vetList.add("[" + i + "] " + String.valueOf(vet[i]));
        PB.setValue(((i+1)*100)/vet.length); // i want update here
    }
} 

我是 Java 新手,我想更新这方面的价值...谁能帮我解决这个问题?

【问题讨论】:

  • 很难看出你的问题是什么,而且 yoru 代码的格式使它很难阅读。你能把它编辑得更清楚吗?
  • 首先,将所有 CBMetodo.getSelectedItem() == "Aleatório" 更改为 CBMetodo.getSelectedItem().equals("Aleatório") .. 使用 EQUAL 而不是 ==
  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。 2)不要阻塞EDT(事件调度线程)。发生这种情况时,GUI 将“冻结”。有关详细信息和修复,请参阅 Concurrency in Swing。 3) “不适合我,我认为这是因为我使用 netbeans。” 在您了解 Java 之前,您不应该使用自动 IDE。即便如此,责怪他的工具的还是一个可怜的商人。

标签: java swing awt event-dispatch-thread jprogressbar


【解决方案1】:

首先:如果您尝试更新您的 PB 值并在同一个线程中显示它,您可能会遇到一些问题(它只会在循环结束时显示内容)。

最好的方法是拆分一个线程来显示用户界面,另一个线程来更新保存进度条值的变量。

试试这个,对 java 使用适当的比较。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    vet = new int[Integer.valueOf(tamVet.getText())];
    ordenado = new int[Integer.valueOf(tamVet.getText())];
    metUtilizado = (String) CBMetodo.getSelectedItem();
    if (CBMetodo.getSelectedItem().equals("Ordenado")) {
        for (int i = 0; i < Integer.valueOf(tamVet.getText()); i++) {
            vet[i] = i;
        }
    } else if (CBMetodo.getSelectedItem().equals("Reverso")) {
        for (int i = 0; i < Integer.valueOf(tamVet.getText()); i++) {
            vet[i] = -i;
        }
    } else if (CBMetodo.getSelectedItem().equals("Aleatório")) {
        Random randomGenerator = new Random();
        for (int i = 0; i < Integer.valueOf(tamVet.getText()); i++) {
            vet[i] = randomGenerator.nextInt(Integer.valueOf(tamVet.getText()));
        }
    }
    vetList.clear();
    new Thread()
    {
        public void run() {
            for (int i = 0; i < vet.length; i++) {
                int N_DIVISOES = vet.length/4;
                vetList.add("[" + i + "] " + String.valueOf(vet[i]));
                PB.setValue((i/N_DIVISOES) * N_DIVISOES); // i want update here
            }
        }
     }.start();
} 

【讨论】:

  • 我不需要更新每个百分比,我至少需要在 25% 50% 75% 时更新。
  • 如果你想在 25 50 75 进行更新...使用我在 for 循环中更改的逻辑。 N_DIVISOES 会给你“de quanto em quanto”你想要更新你的进度条。
  • 不要忘记将您的最大进度条值设置为 vet.length
  • 问题是该栏只更新在末尾for!我需要它继续工作
  • 这是因为您在与用户界面相同的线程中运行更新。让我告诉你更新帖子
猜你喜欢
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多