迭代或循环内部更改JTextField的文本

假设我有一个JTextField“status”,我正在运行这段代码:

status = new JTextField(50); add(status); for (int i=0; i<10000; i++) { status.setText("bla bla - "+ i); System.out.println("bla bla - "+ i); } 

我的问题是,现在当循环运行时,JTextField的文本中没有任何事情发生,并且只有当循环结束时,标签是“bla bla – 10000”。

我想制作类似于状态栏的内容,但无法更新此状态栏“在线”。 我也尝试在一个线程中进行更新,但以相同的结果结束。

有人能告诉我如何在迭代或循环时在GUI中显示文本吗?

使用SwingWorker分割UI更新和长时间运行的任务。

花几分钟时间阅读Swing标签wiki的结尾并按照提供的链接进行操作。

以下是此类代码的一个小示例:

 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; public class TestSwingWorker { private JTextField progressTextField; protected void initUI() { final JFrame frame = new JFrame(); frame.setTitle(TestSwingWorker.class.getSimpleName()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton button = new JButton("Clik me to start work"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { doWork(); } }); progressTextField = new JTextField(25); progressTextField.setEditable(false); frame.add(progressTextField, BorderLayout.NORTH); frame.add(button, BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); } protected void doWork() { SwingWorker worker = new SwingWorker() { @Override protected Void doInBackground() throws Exception { for (int i = 0; i < 100; i++) { // Simulates work Thread.sleep(10); publish(i); } return null; } @Override protected void process(List chunks) { progressTextField.setText(chunks.get(chunks.size() - 1).toString()); } @Override protected void done() { progressTextField.setText("Done"); } }; worker.execute(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new TestSwingWorker().initUI(); } }); } } 

使用javax.swing.Timer 。 这是一个示例,向您展示如何:

 private void refreshMyTextField() { Timer timer1 = new Timer(100, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { jTextField1.setText("bla bla - "+(j++)); } }); timer1.start(); } 

使用Timer类以间隔执行任务。 因为您不使用间隔,所以得到的是最后一个值10000.由于间隔不存在,您无法看到以前的值。

问候,

尝试使用status.setText("");status.setText("bla bla - "+ i);之前status.setText("bla bla - "+ i);