I want to write a program, which search some HTML addresses. I assume that one search will be going more than 1 minute. When I print the results to console everything is OK, but when I make a frame the results don’t appear in textpane. Now I have two classes one to search and one for frame. I write the simply function in the frame class to check if adding text working:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String Txt=(String)jComboBox1.getSelectedItem();
jTextPane1.setText("");
addText(Txt);
SecondClass.find(Txt);
}
public void addText(String text){
StyledDocument doc = jTextPane1.getStyledDocument();
try{
doc.insertString(doc.getLength(), text, null);
}catch(Exception e) { System.out.println(e); }
}
And in SecondClass I write the same line to addText, but it is working only from frame class. The second problem is that if the search is going I cannot do anything in program and the text from frame class is see after search is finished. I want see text immediately after finding it like in console which is working and I want to have possibility to click this link before search is ended ( I don’t implement clickable links yet and don’t know how to do this). I think that I must synchronize the processes, but I don’t know how to do this.
It sounds like you are doing the main downloading task on the special Swing event thread, which handles all the work for Swing components. This will prevent the GUI from responding properly.
This will happen ‘by accident’ if you do long-running actions within event handlers (e.g. when you press a
JButton).You need to do long-running tasks in a separate thread, then ‘hand over’ the data to the Swing thread to update the GUI, using
SwingUtilities.invokeLater(runnable); Edited: or see Max’s answer about SwingWorker.For example, your worker thread would do something like this when it has some data ready, using an anonymous
Runnable:where
getText()just indicates some means of acquiring the downloaded text, andappendtext()is a method you will need to write to update your textpane.