【问题标题】:JTextField in a GUI won't update when using the setText() method使用 setText() 方法时,GUI 中的 JTextField 不会更新
【发布时间】:2015-03-07 03:05:55
【问题描述】:

我有一个带有 JTextField 的 GUI,它应该代表一个进度条。最初我将它设置为“0%”,它位于水平位置,有足够的文本空间。然而,当程序运行时,JTextField 拒绝更改,即使在我使用 progress.setText() 之后也是如此。奇怪的是,当我使用 progress.getText() 时,它会打印出它应该打印的内容。我试过环顾不同的区域,但大多数人只是说使用我尝试过的 .revalidate() 或 .repaint ,但都不起作用。相关代码在这里:

if(box3.isSelected()){
                progress.setText("0%");
                int i = 0;
                FragChecker fc = new FragChecker();
                String[] temp = new String[0];
                LexicalizedParser lp = fc.LPReciever(temp);
                while(i < tn.sentenceSizeGetter()){
                    tn.fragChecker((double)i, temp, lp);
                    setProgress(tn.fragPercentDone((double)i));
                    i++;
                }
            }

tn 引用我的 Tokenizer 类,tn.sentencesSizeGetter 返回数组列表的大小。 tn.fragPercentDone 返回已处理的句子除以总句子数,乘以 100。相关代码的下一位是 setProgress:

public void setProgress(String x){
    System.out.println(x);
    progress.setText(x + "%");
    System.out.println(progress.getText());
}

【问题讨论】:

  • 为什么要在while循环中设置文本?
  • 通过 Swing 工作线程将更新提交到文本字段。

标签: java user-interface jtextfield settext


【解决方案1】:

您的问题听起来像是一个经典的 Swing 线程问题——您可能在 Swing 事件线程上运行长时间运行的代码,这会阻止 GUI 更新其任何图形。解决方案:在后台线程中执行长时间运行的代码,然后确保在事件线程上更新 Swing 组件状态。 SwingWorker 可以很好地解决这个问题。

类似......

     progress.setText("0%");
     final FragChecker fc = new FragChecker();
     final String[] temp = new String[0];
     final LexicalizedParser lp = fc.LPReciever(temp);

     new SwingWorker<Void, String>() {
        int i = 0;

        @Override
        protected Void doInBackground() throws Exception {
           while (i < tn.sentenceSizeGetter()) {
              tn.fragChecker((double) i, temp, lp);
              publish(tn.fragPercentDone((double) i));
              i++;
           }
           return null;
        }

        protected void process(java.util.List<String> chunks) {
           for (String chunk : chunks) {
              setMyProgress(chunk);
           }
        };
     }.execute();
  }

【讨论】:

  • 谢谢!这主要是有效的。但是,我现在有一个问题,即在受保护的 void doInBackground() 内,我的 tn.sentenceSizeGetter() 更改了值。在 doInBackground 之外它的值大于 0,但是当我将它打印到 doInBackground 内的控制台时,它会打印一个值 0。这会导致 while 循环无法运行,从而使一切都不起作用,不知道为什么会这样做那?谢谢!
  • @Nerdydude101:是时候使用调试器了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
相关资源
最近更新 更多