我有一个带有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());
}
答案 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();
}