Link to home
Start Free TrialLog in
Avatar of Samsara82
Samsara82Flag for Finland

asked on

JDialogs content doesn't update, using StringBuilder

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());
          }
            
      }

}
Avatar of Samsara82
Samsara82
Flag of Finland image

ASKER

Points increased.
Avatar of sciuriware
sciuriware

>>>                   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!
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.
SOLUTION
Avatar of sciuriware
sciuriware

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
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.
ASKER CERTIFIED SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial