我想用setText()方法更新jlabel和jtextfield,但它不起作用。但是,其余代码正在运行。代码如下;
btnDosyaSe.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int kullaniciSecimi = jfc.showOpenDialog(null);
if (kullaniciSecimi == JFileChooser.APPROVE_OPTION) {
File fileName = jfc.getSelectedFile();
textField.setText(fileName.getPath());
islemSureci.setText("Veriler Okunuyor...");
try {
ArrayList<ArrayList<String>> tumYazılar = rwd.readTXT(fileName.getPath());
String[] yazarlar = rwd.yazarlar(fileName.getPath());
islemSureci.setText("Veriler Okundu! Öznitelik çıkarımına başlandı...");
oznitelikler = oc.oznitelikleriBul(tumYazılar, yazarlar);
islemSureci.setText("Öznitelikler Çıkarılmıştır!");
//String text = readTXT(fileName);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
在这里,islemSureci是JLabel,textFiled是JTextField。当它们被设置时,它不起作用。完成代码中的所有工作后,它们就会出现。请问你能说出原因是什么吗?
答案 0 :(得分:3)
您的长时间运行任务在Event Dispatcher Thread中执行,该线程锁定应该执行更新的线程。因此,只有在任务完成后才会执行真正的更新。
在SwingWorker中运行
参见例如
http://www.javacreed.com/swing-worker-example/
或
答案 1 :(得分:1)
我认为你的意思是“完成所有工作后”正在从文件中加载文本(您评论的行)。我认为这段代码工作正常,因为您在设置文本后没有做任何事情。 如果是,则可以使用另一个线程来加载文本。
如果 oc.oznitelikleriBul()需要很长时间,您可以在不同的线程中编写该行和文本设置行。但是,在这种情况下,请确保在新主题内的EDT中运行文本设置行。
答案 2 :(得分:0)
我有同样的问题。我如何解决,见下文:
我有2个JFrame类。 Login.java和Employee.java。登录后,我无法在Employee Form中将Text()设置为JTextField对象。所以我做了...我使用setVisible()员工表单和这段代码。现在我可以刷新我的JTextField。
谢谢,我希望它能解决问题。
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Employee().setVisible(true);
}
});