使用setText()方法时,GUI中的JTextField不会更新

时间:2015-03-07 03:05:55

标签: java user-interface jtextfield settext

我有一个带有JTextField的GUI,它应该代表一个进度条。最初我把它设置为" 0%"它位于水平位置,有足够的文字空间。但是,在程序运行时,即使在使用progress.setText()之后,JTextField也拒绝更改。奇怪的是,当我使用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());
}

1 个答案:

答案 0 :(得分:4)

你的听起来像是一个经典的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();
  }