我打印简单的使用值简单的for循环追加JTextArea
,当我运行它,它的正常运行,如果我在控制台输出打印值...为什么我的线程在Swing中无法正常工作?
但是,如果我在文本区附加JTextArea
和打印值,它们会在整个程序运行后追加。
public class SwingThread {
private JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SwingThread window = new SwingThread();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public SwingThread() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scrollPane = new JScrollPane();
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
JTextArea textArea = new JTextArea();
scrollPane.setViewportView(textArea);
JButton btnNewButton = new JButton("New button");
scrollPane.setColumnHeaderView(btnNewButton);
btnNewButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
try
{
for(int i = 0 ; i <= 5 ; i++)
{
textArea.append("Value "+i+"\n");
System.out.println("Value is" + i);
Thread.sleep(1000);
}
}
catch(Exception e)
{
System.out.println("Error : "+e);
}
}
});
}
}
我想一个接一个追加,但在整个程序运行后追加。
这很容易用计时器解决,如答案所示。但是对于更复杂的处理,你需要一个后台线程 – efekctive
@efekctive *“但是对于更复杂的处理,你需要一个后台线程”*如果通过复杂你的意思是一个任务需要明显的时间来执行,那么'SwingWorker '非常适合做这件事。一个swing工作者使用一个单独的线程,但也提供了简单的方法将GUI更新放回到EDT上,在那里他们应该完成。 –
请参阅编辑以回答 –