Solved

JDialogs content doesn't update, using StringBuilder

Posted on 2008-10-29
7
581 Views
Last Modified: 2013-11-23
Hi,

Im new with Java and I have a problem with using StringBuilder. I have Java GUI (Recipebook) where user can add, remove and list recipes. All works fine except the listing (JTextArea with added text from StringBuilder). It works the first time but when I e.g add new recipe and want to list all recipes (including the new one) my listing still shows the old list without last added recipe. I need to close my application before the changes shows in list.

My question is: How I can "update" my list so it will show the changes made instantly?


Here's the actionListener:

class RecipeList implements ActionListener {
            
            public void actionPerformed(java.awt.event.ActionEvent e) {
                  
                listDialog.setVisible(true);
                listDialog.validate();
            }
}


Here's ListDialog Class:

public class ListDialog extends JDialog {
      
      private static final long serialVersionUID = 1L;
      private JScrollPane scrollPane1;
      private JTextArea area;
      
      public ListDialog(Frame parentFrame) {
            
            super(parentFrame);
            
            setTitle("Test Dialog");
            setSize(350, 400);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);

            JPanel topPanel = new JPanel();
            topPanel.setLayout(new BorderLayout());
            getContentPane().add(topPanel);

            CreateTopPane(topPanel);
            
      }
      
      public void CreateTopPane( JPanel topPanel ) {
            
            area = new JTextArea();
            area.setEditable(false);
            
            BuildList();

            // Create the scrolling pane for the text area
            scrollPane1 = new JScrollPane();
            scrollPane1.getViewport().add( area );
            topPanel.add( scrollPane1, BorderLayout.CENTER );
            
      }
      
        //Parse Xml-file (DOM) and save in StringBuilder

      public void BuildList() {
            
            try {
                  
                  BufferedReader br = new BufferedReader(new FileReader("TestDOMXML4.xml"));
                  StringBuilder sb = new StringBuilder();
                  
                  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                  DocumentBuilder loader = factory.newDocumentBuilder();
                  Document doc = loader.parse("TestDOMXML4.xml");
                  
                  doc.getDocumentElement().normalize();
                  
                  NodeList listOfRecipes = doc.getElementsByTagName("recipe");
                  
                  
                  for(int i=0; i < listOfRecipes.getLength(); i++) {
                        
                        Node firstRecipeNode = listOfRecipes.item(i);
                        if (firstRecipeNode.getNodeType() == Node.ELEMENT_NODE) {
                              
                              Element firstRecipeElement = (Element)firstRecipeNode;
                              
                              NodeList nameList = firstRecipeElement.getElementsByTagName("name");
                              Element nameElement = (Element)nameList.item(0);
                              
                              NodeList textNameList = nameElement.getChildNodes();
                              String name = textNameList.item(0).getNodeValue().trim();
                              sb.append("Nimi: "+name+"\n");
                              
                              NodeList categoryList = firstRecipeElement.getElementsByTagName("category");
                              Element categoryElement = (Element)categoryList.item(0);
                              
                              NodeList textCategoryList = categoryElement.getChildNodes();
                              String category = textCategoryList.item(0).getNodeValue().trim();
                              sb.append("Kategoria: "+category+"\n");
                              
                              NodeList preparationList =
firstRecipeElement.getElementsByTagName("preparation");
                              Element preparationElement = (Element)preparationList.item(0);
                              
                              NodeList textPreparationList = preparationElement.getChildNodes();
                              String prep = textPreparationList.item(0).getNodeValue().trim();
                              sb.append("Ohje: "+prep+"\n\n");
                        }
                  }
                  
                  br.close();

                  area.append(sb.toString());
                  
            }
            
            catch (Exception e) {
              
                  System.out.println(e.getMessage());
          }
            
      }

}
0
Comment
Question by:Samsara82
  • 4
  • 2
7 Comments
 

Author Comment

by:Samsara82
ID: 22839141
Points increased.
0
 
LVL 24

Expert Comment

by:sciuriware
ID: 22839217
>>>                   area.append(sb.toString());

I never did it that way.
I always practise:

String newText = ......................;
 String s = area.getText();
 area.setText(s + newText);

But .....................................................
If you want the additions listed top-down, it's better to set the first text:

area.setText("<HTML><CENTER>" + firstText;

and subsequently:

area.setText(area.getText() + "<BR>" + newText);

;JOOP!
0
 

Author Comment

by:Samsara82
ID: 22839454
Thanks for the answer sciuriware,

I changed

area.append(sb.toString());

to your first solution

String newText = ......................;
 String s = area.getText();
 area.setText(s + newText);

It's working as the same as area.append(sb.toString());

Im not quite sure what is this firstText in area.setText("<HTML><CENTER>" + firstText); What String should it contain?

But still, this doesn't solve my original problem. If I list all recipes, close my listing dialog, add new recipe and open up my listing dialog again, it still shows the old list.
0
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 
LVL 24

Assisted Solution

by:sciuriware
sciuriware earned 200 total points
ID: 22839843
>>> Im not quite sure what is this firstText in area.setText("<HTML><CENTER>" + firstText); What String should it contain?

A JTextArea can handle HTML text, therefore the first text is preceeded by "<HTML>".


I get the impression that everything works, but that your JTextArea doesn't
get a chance to be updated.
That happens when you do all your work above on the event thread.

When an action is started from a button, you MUST put all lengthy operations
in a separate Thread or you get the problem you have.

;JOOP!
0
 

Author Comment

by:Samsara82
ID: 22846161
Thanks again, I changed my code to this:

//Main GUI

class RecipeList implements ActionListener {
           
            public void actionPerformed(java.awt.event.ActionEvent e) {
                 
                listDialog.setVisible(true);
                listDialog.validate();
            }
}


//ListDialog class

public class ListDialog extends JDialog implements Runnable {
      
      private static final long serialVersionUID = 1L;
      private JScrollPane scroll;
      private JTextArea area;
      
      
      public ListDialog(Frame parentFrame) {
                  
            super(parentFrame);
                  
            setTitle("List Recipes");
            setSize(350, 400);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);

            JPanel topPanel = new JPanel();
            topPanel.setLayout(new BorderLayout());
            getContentPane().add(topPanel);
                  
            area = new JTextArea();
            area.setEditable(false);

            scroll = new JScrollPane();
            //scroll.add(area);
            scroll.getViewport().add( area );
            topPanel.add(scroll);
            
            new Thread(this).start();
            
      }
            
      public void run() {
                  
            try {
                        
                  BufferedReader br = new BufferedReader(new FileReader("TestDOMXML4.xml"));
                  StringBuilder sb = new StringBuilder();
                  
                  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();                        DocumentBuilder loader = factory.newDocumentBuilder();
                  Document doc = loader.parse("TestDOMXML4.xml");
                        
                  doc.getDocumentElement().normalize();
                        
                  NodeList listOfRecipes = doc.getElementsByTagName("recipe");
                        
                        
                  for(int i=0; i < listOfRecipes.getLength(); i++) {
                              
                        Node firstRecipeNode = listOfRecipes.item(i);
                        
                        if (firstRecipeNode.getNodeType() == Node.ELEMENT_NODE) {
                                    
                              Element firstRecipeElement = (Element)firstRecipeNode;
                                    
                              NodeList nameList = firstRecipeElement.getElementsByTagName("name");
                              Element nameElement = (Element)nameList.item(0);
                                    
                              NodeList textNameList = nameElement.getChildNodes();
                              String name = textNameList.item(0).getNodeValue().trim();
                              sb.append("Nimi: "+name+"\n");
                                    
                              NodeList categoryList = firstRecipeElement.getElementsByTagName("category");
                              Element categoryElement = (Element)categoryList.item(0);
                                    
                              NodeList textCategoryList = categoryElement.getChildNodes();
                              String category = textCategoryList.item(0).getNodeValue().trim();
                              sb.append("Kategoria: "+category+"\n");
                                    
                              NodeList preparationList = firstRecipeElement.getElementsByTagName("preparation");
                              Element preparationElement = (Element)preparationList.item(0);
                                    
                              NodeList textPreparationList = preparationElement.getChildNodes();
                              String prep = textPreparationList.item(0).getNodeValue().trim();
                              sb.append("Ohje: "+prep+"\n\n");
                        }
                  }
                        
                  br.close();
                  
                  area.append(sb.toString());
            
            }
                  
            catch (Exception e) {
                  
                  System.out.println(e.getMessage());
            }
                  
      }
}


But still..doesn't work :(

Can you suggest something that could be wrong? I have tested add/remove methods, these methods change my xml-file instantly, I just can't show these changes in my listing.
0
 

Accepted Solution

by:
Samsara82 earned 0 total points
ID: 22863621
I solve the problem myself. It was quite easy actually..At original GUI I made new object of JDialog in GUI's constructor. In the solution I moved that to the actionlistener

class RecipeList implements ActionListener {
           
            public void actionPerformed(java.awt.event.ActionEvent e) {
               
                listDialog = new ListDialog(frame);
                listDialog.setVisible(true);

            }
}

It's working now and im happy :)
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

By the end of 1980s, object oriented programming using languages like C++, Simula69 and ObjectPascal gained momentum. It looked like programmers finally found the perfect language. C++ successfully combined the object oriented principles of Simula w…
Introduction This article is the second of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers the basic installation and configuration of the test automation tools used by…
Viewers will learn about if statements in Java and their use The if statement: The condition required to create an if statement: Variations of if statements: An example using if statements:
Viewers will learn about the regular for loop in Java and how to use it. Definition: Break the for loop down into 3 parts: Syntax when using for loops: Example using a for loop:

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question