Solved

JDialogs content doesn't update, using StringBuilder

Posted on 2008-10-29
7
586 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
What Is Transaction Monitoring and who needs it?

Synthetic Transaction Monitoring that you need for the day to day, which ensures your business website keeps running optimally, and that there is no downtime to impact your customer experience.

 
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

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Java Flight Recorder and Java Mission Control together create a complete tool chain to continuously collect low level and detailed runtime information enabling after-the-fact incident analysis. Java Flight Recorder is a profiling and event collectio…
Introduction This article is the last of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers our test design approach and then goes through a simple test case example, how …
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.
The viewer will learn how to synchronize PHP projects with a remote server in NetBeans IDE 8.0 for Windows.

695 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