# Problem mit der aktualisierung von JTree und Text Area



## Lenzen (14. Jun 2007)

Hallo,

ich habe folgendes Problem:

Ich habe ein Programm geschrieben was eine log Datei einlesen kann. Die Log datei hat IP Adressen und den dazugehörigen Teil auf dem der User gesurft hat.
Die IP-Adressen werden in ein JTree eingefügt ( linke Seite des Fensters ) und der Inhalt auf die Rechte Seite in einer JText Area.

zusätzlich habe ich noch ein TextFeld gemacht um auch direkt die IP Adresse dort eingeben zu können.

Bsp.:


       -----------------------------------------
      | 117.35.12.3                                 |    SerachButton
       ----------------------------------------- 

JTree                             TextFeld

IP-Adressen                   
117.35.12.30        | sdkjfhksjckjsdvkjsdvkjsd Inhalt der WebSeite
118.35.12.31        | sdkjfhksjckjsdvkjsdvkjsd Inhalt der WebSeite
119.35.12.88        | sdkjfhksjckjsdvkjsdvkjsd Inhalt der WebSeite
111.35.12.32        | sdkjfhksjckjsdvkjsdvkjsd Inhalt der WebSeite
114.35.12.93        | sdkjfhksjckjsdvkjsdvkjsd Inhalt der WebSeite
115.35.12.85        | sdkjfhksjckjsdvkjsdvkjsd Inhalt der WebSeite
116.35.12.31        | sdkjfhksjckjsdvkjsdvkjsd Inhalt der WebSeite
118.35.12.67        | sdkjfhksjckjsdvkjsdvkjsd Inhalt der WebSeite
119.35.12.49        | sdkjfhksjckjsdvkjsdvkjsd Inhalt der WebSeite
110.35.12.32        | sdkjfhksjckjsdvkjsdvkjsd Inhalt der WebSeite

------------------------------------------------------------------------------------------------

- wenn ich nun eine IP Adresse anklicke, erscheint rechts der Inhalt 
- wenn ich nun eine weitere IP Adresse anklicke, bleibt der Rest des alten Inhalts weiterhin bestehen
- auch der JTree erscheint dann lückenhaft

Wie kann ich realisieren, dass beide Seiten aktualisiert werden sobald ich auf den Baum klicke oder den Seach Button drücke?

Mein Code bisher:

```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

public class NewJFrame extends javax.swing.JFrame {
	private JMenuBar MenuLeiste;
	private JTextField jTextField1;
	private JMenu fileMenu1;
	private JMenuItem ExitMenuItem1;
	private JButton SearchButton1;
	private JLabel chooseLabel1;
	private JMenu fileMenue;
	private JSplitPane jSplitPane1;
	private JScrollPane jScrollPane1;
	private JScrollPane jScrollPane2;
	private JMenuItem exitMenuItem1;
	private JSeparator jSeparator1;
	private JMenuItem openMenuItem1;
	private JTree jTree1;

	private String ip = "";
	private Scanner s;
	private FileWriter fstream;
	private BufferedWriter out;
	private Matcher mat = null;

	private static final long serialVersionUID = 1L;
	static String PATH = "d:\\Test\\AD_weblog.log";
	static String OUTFILE = "d:\\Test\\TestWrite.txt";
	static String suchwort = "145.254.32.119";

	public static void main(String[] args) throws FileNotFoundException,
			IOException {
		NewJFrame inst = new NewJFrame("");
		inst.setVisible(true);
		inst.pack();
		inst.setSize(793, 646);

	}

	public NewJFrame(String ip) throws FileNotFoundException, IOException {
		super();
		this.ip = ip;
		initGUI(ip);
	}

	private void initGUI(String ip) throws FileNotFoundException, IOException {
		this.s = new Scanner(new File(PATH));
		this.fstream = new FileWriter(OUTFILE);
		this.out = new BufferedWriter(fstream);

		setTitle("Search for IP Address in LogFiles");
		this.setLayout(null);

		try {
			// Close window
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			{
				jTextField1 = new JTextField();
				getContentPane().add(jTextField1);
				jTextField1.setText("");
				jTextField1.setBounds(7, 7, 462, 28);
			}
			{
				chooseLabel1 = new JLabel();
				getContentPane().add(chooseLabel1);
				chooseLabel1.setText("Choose the IP Address");
				chooseLabel1.setBounds(476, 7, 130, 28);
			}
			{
				SearchButton1 = new JButton();
				getContentPane().add(SearchButton1);
				SearchButton1.setText("Search");
				SearchButton1.setBounds(623, 7, 133, 28);
				SearchButton1.addActionListener(new Ereignis());
			}
			{
				jSplitPane1 = new JSplitPane();
				getContentPane().add(jSplitPane1);
				jSplitPane1.setBounds(7, 42, 770, 539);
				{
					JTextArea text = new JTextArea();
					DefaultMutableTreeNode root = new DefaultMutableTreeNode("IPAdressen");
					String ipAddress = "";
					String tmp = "";
					String zweiterTeil = "";
					while (s.hasNextLine()) {
						String str = s.nextLine();
						//if (str.startsWith(suchwort)) {
						if (str.startsWith(ip)) {
							// Ausgabe von IP+Seite
							//System.out.println(str);

							// Daten in Datei schreiben
							//out.write(str);
							//out.newLine();

							//Füllen der TextArea
							//jTextArea1.setText("sdlkjskdlvnlsdknvlksdnvl");
							//text.append(str);
							//text.append("\n");

							//2.Teil in TexArea fügen
							zweiterTeil = str.split("(\\d+)(\\.\\d+){3}")[1];
							text.append(zweiterTeil);
							text.append("\n");

							//text.setLineWrap(false); // Zeilenumbruch		
							mat = Pattern.compile("(\\d+)(\\.\\d+){3}")
									.matcher(str);

							while (mat.find()) {
								ipAddress = mat.group(0).toString(); // temporärer string   
								if (!tmp.equals(ipAddress)) {
									root.add(new DefaultMutableTreeNode(
											ipAddress));
								}
							}
							tmp = ipAddress;

						}
					}

					jScrollPane1 = new JScrollPane(text);
					jSplitPane1.add(jScrollPane1, JSplitPane.RIGHT);

					jTree1 = new JTree(root);
					jTree1.getSelectionModel().addTreeSelectionListener(
							new TreeSelectionListener() {
								public void valueChanged(TreeSelectionEvent e) {
									TreePath path = e.getNewLeadSelectionPath();
									TreeNode node = (TreeNode) path.getLastPathComponent();
									String testNode = node.toString();
									try {
										if (testNode.equals("IPAdressen")) {
											//System.out.print("ROOT");				                        	
											initGUI("");
										} else {
											//System.out.print("Node");												
											initGUI(testNode);
										}
									} catch (Exception e1) {
									}
									System.out.println(testNode);
								}
							});
					jScrollPane2 = new JScrollPane(jTree1);
					jSplitPane1.add(jScrollPane2, JSplitPane.LEFT);
					// Grösse der linken Seite einstellen
					jSplitPane1.setDividerLocation(0.2);

				}
			}
			{
				MenuLeiste = new JMenuBar();
				setJMenuBar(MenuLeiste);
				MenuLeiste.setPreferredSize(new java.awt.Dimension(785, 27));
				{
					fileMenu1 = new JMenu();
					MenuLeiste.add(fileMenu1);
					fileMenu1.setText("File");
					{
						openMenuItem1 = new JMenuItem();
						fileMenu1.add(openMenuItem1);
						openMenuItem1.setText("open");
						openMenuItem1.addActionListener(new Ereignis());
					}
					{
						jSeparator1 = new JSeparator();
						fileMenu1.add(jSeparator1);
					}
					{
						exitMenuItem1 = new JMenuItem();
						fileMenu1.add(exitMenuItem1);
						exitMenuItem1.setText("exit");
						exitMenuItem1.addActionListener(new Ereignis());
					}
				}

			}
			//pack();		
			setVisible(true);
			setSize(793, 646);
		} catch (Exception e) {
			e.printStackTrace();
		}
		//BufferedWriter schliessen
		try {
			out.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//Scanner schliessen
		s.close();
	}

	public class Ereignis implements ActionListener {

		//Create a file chooser
		final JFileChooser fc = new JFileChooser("D:/Test");

		public void actionPerformed(ActionEvent e) {
			//Handle open button action.
			if (e.getSource() == openMenuItem1) {
				int returnVal = fc.showOpenDialog(NewJFrame.this);
				if (returnVal == JFileChooser.APPROVE_OPTION) {
					File file = fc.getSelectedFile();
					System.out.println(file.getAbsolutePath());
				} else
					System.out.println("Auswahl abgebrochen");
				//System.exit(1);
			}
			if (e.getSource() == exitMenuItem1) {
				//Close window			
				dispose();
				System.exit(0);
			}
			if (e.getSource() == SearchButton1) {				
				ip = jTextField1.getText();
				System.out.println(ip);
				try {
					initGUI(ip);
				} catch (Exception e1) {
				}
			}
		}
	}
}
```


----------



## André Uhres (16. Jun 2007)

So ungefähr stelle ich mir vor, daß du es haben willst:

```
package tree;
/*
 * NewJFrame.java
 */
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
public class NewJFrame extends JFrame {
    private JMenuBar menuLeiste;
    private JTextField jTextField1;
    private JMenu fileMenu1;
    private JMenuItem exitMenuItem1;
    private JButton searchButton1;
    private JLabel chooseLabel1;
    private JMenu fileMenue;
    private JSplitPane jSplitPane1;
    private JScrollPane jScrollPane1;
    private JScrollPane jScrollPane2;
    private JMenuItem exitMenuItem2;
    private JSeparator jSeparator1;
    private JMenuItem openMenuItem1;
    private JTree jTree1;
    private String ip = "";
    private Scanner s;
    private FileWriter fstream;
    private BufferedWriter out;
    private Matcher mat = null;
    private static final long serialVersionUID = 1L;
    static String PATH = "d:\\Test\\AD_weblog.log";
    static String OUTFILE = "d:\\Test\\TestWrite.txt";
    static String suchwort = "145.254.32.119";
    private JTextArea text;
    private boolean found;
    private DefaultMutableTreeNode currentValue;
    public static void main(String[] args) throws FileNotFoundException, IOException {
        NewJFrame inst = new NewJFrame("");
        inst.setSize(793, 646);
        inst.setVisible(true);
    }
    public NewJFrame(String ip) throws FileNotFoundException, IOException {
        super();
        this.ip = ip;
        initGUI(ip);
    }
    private void initGUI(String ip) throws FileNotFoundException, IOException {
        this.s = new Scanner(new File(PATH));
        this.fstream = new FileWriter(OUTFILE);
        this.out = new BufferedWriter(fstream);
        setTitle("Search for IP Address in LogFiles");
        this.setLayout(null);
        try {
            // Close window
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            {
                jTextField1 = new JTextField();
                getContentPane().add(jTextField1);
                jTextField1.setText("");
                jTextField1.setBounds(7, 7, 462, 28);
            }
            {
                chooseLabel1 = new JLabel();
                getContentPane().add(chooseLabel1);
                chooseLabel1.setText("Choose the IP Address");
                chooseLabel1.setBounds(476, 7, 130, 28);
            }
            {
                searchButton1 = new JButton();
                getContentPane().add(searchButton1);
                searchButton1.setText("Search");
                searchButton1.setBounds(623, 7, 133, 28);
                searchButton1.addActionListener(new Ereignis());
            }
            {
                jSplitPane1 = new JSplitPane();
                getContentPane().add(jSplitPane1);
                jSplitPane1.setBounds(7, 42, 770, 539);
                {
                    text = new JTextArea();
                    DefaultMutableTreeNode root = new DefaultMutableTreeNode("IPAdressen");
                    String ipAddress = "";
                    String tmp = "";
                    String zweiterTeil = "";
                    while (s.hasNextLine()) {
                        String str = s.nextLine();
                        //if (str.startsWith(suchwort)) {
                        if (str.startsWith(ip)) {
                            // Ausgabe von IP+Seite
                            //System.out.println(str);
                            // Daten in Datei schreiben
                            //out.write(str);
                            //out.newLine();
                            //Füllen der TextArea
                            //jTextArea1.setText("sdlkjskdlvnlsdknvlksdnvl");
                            //text.append(str);
                            //text.append("\n");
                            //2.Teil in TexArea fügen
                            zweiterTeil = str.split("(\\d+)(\\.\\d+){3}")[1];
                            text.append(zweiterTeil);
                            text.append("\n");
                            //text.setLineWrap(false); // Zeilenumbruch
                            mat = Pattern.compile("(\\d+)(\\.\\d+){3}").matcher(str);
                            while (mat.find()) {
                                ipAddress = mat.group(0).toString(); // temporärer string
                                if (!tmp.equals(ipAddress)) {
                                    root.add(new DefaultMutableTreeNode(new IPNode(ipAddress, zweiterTeil)));
                                }
                            }
                            tmp = ipAddress;
                        }
                    }
                    jScrollPane1 = new JScrollPane(text);
                    jSplitPane1.add(jScrollPane1, JSplitPane.RIGHT);
                    jTree1 = new JTree(root);
                    jTree1.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
                        public void valueChanged(TreeSelectionEvent e) {
                            TreePath path = e.getNewLeadSelectionPath();
                            DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
                            String testNode = node.toString();
                            Object userNode = node.getUserObject();
                            if(userNode instanceof IPNode){
                                IPNode ipNode = (IPNode) userNode;
                                text.setText( ipNode.getContents() );
                            }
                            System.out.println(testNode);
                        }
                    });
                    jScrollPane2 = new JScrollPane(jTree1);
                    jSplitPane1.add(jScrollPane2, JSplitPane.LEFT);
                    // Grösse der linken Seite einstellen
                    jSplitPane1.setDividerLocation(0.2);
                }
            }
            {
                menuLeiste = new JMenuBar();
                setJMenuBar(menuLeiste);
                menuLeiste.setPreferredSize(new Dimension(785, 27));
                {
                    fileMenu1 = new JMenu();
                    menuLeiste.add(fileMenu1);
                    fileMenu1.setText("File");
                    {
                        openMenuItem1 = new JMenuItem();
                        fileMenu1.add(openMenuItem1);
                        openMenuItem1.setText("open");
                        openMenuItem1.addActionListener(new Ereignis());
                    }
                    {
                        jSeparator1 = new JSeparator();
                        fileMenu1.add(jSeparator1);
                    }
                    {
                        exitMenuItem2 = new JMenuItem();
                        fileMenu1.add(exitMenuItem2);
                        exitMenuItem2.setText("exit");
                        exitMenuItem2.addActionListener(new Ereignis());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //BufferedWriter schliessen
        try {
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //Scanner schliessen
        s.close();
    }
    public class Ereignis implements ActionListener {
        //Create a file chooser
        final JFileChooser fc = new JFileChooser("d:/Test");
        public void actionPerformed(ActionEvent e) {
            //Handle open button action.
            if (e.getSource() == openMenuItem1) {
                int returnVal = fc.showOpenDialog(NewJFrame.this);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
                    System.out.println(file.getAbsolutePath());
                } else
                    System.out.println("Auswahl abgebrochen");
                //System.exit(1);
            }
            if (e.getSource() == exitMenuItem2) {
                //Close window
                dispose();
                System.exit(0);
            }
            if (e.getSource() == searchButton1) {
                ip = jTextField1.getText();
                System.out.println(ip);
                traverse(jTree1);
                if(found){
                    IPNode ipNode = (IPNode) currentValue.getUserObject();
                    text.setText( ipNode.getContents() );
                    jTree1.setSelectionPath(new TreePath(currentValue.getPath()));
                }
            }
        }
    }
    /*
     * Die Methoden "traverse" und "walk" dienen dazu den Baum zu durchlaufen
     * um eine bestimmte IP Addresse zu finden
     */
    public void traverse(JTree tree) {
        found = false;
        TreeModel model = tree.getModel();
        if (model != null) {
            Object root = model.getRoot();
            walk(model,root);
        } else
            System.out.println("Tree is empty.");
    }
    protected void walk(TreeModel model, Object o){
        int  cc;
        cc = model.getChildCount(o);
        LOOP: for( int i=0; i < cc; i++) {
            DefaultMutableTreeNode child = (DefaultMutableTreeNode) model.getChild(o, i );
            if (model.isLeaf(child) ){
                TreeNode[] ar = child.getPath();
                for (int j = 0; j < ar.length; j++) {
                    currentValue = (DefaultMutableTreeNode) ar[j];
                    if(currentValue.getUserObject() instanceof IPNode){
                        IPNode ipNode = (IPNode)currentValue.getUserObject();
                        String ipS = ipNode.getIp();
                        if(ipS.equals(ip)){
                            found = true;
                            break LOOP;
                        }
                    }
                }
            }else {
                walk(model,child );
            }
        }
    }
}
/*
 * IPNode
 *
 * kapselt die IP Addresse zusammen mit dem entsprechenden Seiteninhalt
 */
class IPNode{
    private String ip;
    private String contents;
    public IPNode(String ip, String contents){
        this.ip = ip;
        this.contents = contents;
    }
    public String getContents() {
        return contents;
    }
    public String getIp() {
        return ip;
    }
    public void setContents(String contents) {
        this.contents = contents;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public String toString() {
        return ip;
    }
}
```


----------



## Lenzen (16. Jun 2007)

Allerbesten Dank für die Hilfe !

Ich hab nun nur noch eine Sache: 
- wenn ich auf eine der IP Adressen klicke erscheint im rechten TextFeld nur ein Eintrag
- wenn es nun aber für eine IP Adresse mehrere Einträge gibr werden diese nicht ausgegeben

Ich habe mit der tmp Variable IP Adressen, die nach einander stehen entfernen können, weiß aber nicht, ob dass der beste Weg ist, denn eigentlich sollen sie nicht doppelt vorkommen im Tree.
Eine kleine Änderung mit dem dem splitten des String habe ich ebenfalls vorgenommen.


```
.....
   mat = Pattern.compile("(\\d+)(\\.\\d+){3}").matcher(str);
                            while (mat.find()) {
                                ipAddress = mat.group(0).toString(); // temporärer string
                                zweiterTeil = str.split(ipAddress)[1];
                                text.append(zweiterTeil);
                                text.append("\n");
                                if (!tmp.equals(ipAddress)) {
                                    root.add(new DefaultMutableTreeNode(new IPNode(ipAddress, zweiterTeil)));
                                }
                            }
                            tmp = ipAddress;
                        }

.....
```


----------



## André Uhres (16. Jun 2007)

```
package tree;
/*
 * NewJFrame.java
 */
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.List;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
public class NewJFrame extends JFrame {
    private JMenuBar menuLeiste;
    private JTextField jTextField1;
    private JMenu fileMenu1;
    private JMenuItem exitMenuItem1;
    private JButton searchButton1;
    private JLabel chooseLabel1;
    private JMenu fileMenue;
    private JSplitPane jSplitPane1;
    private JScrollPane jScrollPane1;
    private JScrollPane jScrollPane2;
    private JMenuItem exitMenuItem2;
    private JSeparator jSeparator1;
    private JMenuItem openMenuItem1;
    private JTree jTree1;
    private String ip = "";
    private Scanner s;
    private FileWriter fstream;
    private BufferedWriter out;
    private Matcher mat = null;
    private static final long serialVersionUID = 1L;
    static String PATH = "c:\\Test\\AD_weblog.log";
    static String OUTFILE = "c:\\Test\\TestWrite.txt";
    static String suchwort = "145.254.32.119";
    private JTextArea text;
    private boolean found;
    private DefaultMutableTreeNode currentValue;
    public static void main(String[] args) throws FileNotFoundException, IOException {
        NewJFrame inst = new NewJFrame();
        inst.setSize(793, 646);
        inst.setVisible(true);
    }
    public NewJFrame() throws FileNotFoundException, IOException {
        super();
        initGUI();
    }
    private void initGUI() throws FileNotFoundException, IOException {
        this.s = new Scanner(new File(PATH));
        this.fstream = new FileWriter(OUTFILE);
        this.out = new BufferedWriter(fstream);
        setTitle("Search for IP Address in LogFiles");
        this.setLayout(null);
        try {
            // Close window
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            {
                jTextField1 = new JTextField();
                getContentPane().add(jTextField1);
                jTextField1.setText("");
                jTextField1.setBounds(7, 7, 462, 28);
            }
            {
                chooseLabel1 = new JLabel();
                getContentPane().add(chooseLabel1);
                chooseLabel1.setText("Choose the IP Address");
                chooseLabel1.setBounds(476, 7, 130, 28);
            }
            {
                searchButton1 = new JButton();
                getContentPane().add(searchButton1);
                searchButton1.setText("Search");
                searchButton1.setBounds(623, 7, 133, 28);
                searchButton1.addActionListener(new Ereignis());
            }
            {
                jSplitPane1 = new JSplitPane();
                getContentPane().add(jSplitPane1);
                jSplitPane1.setBounds(7, 42, 770, 539);
                {
                    text = new JTextArea();
                    DefaultMutableTreeNode root = new DefaultMutableTreeNode("IPAdressen");
                    jTree1 = new JTree(root);
                    String zweiterTeil = "";
                    while (s.hasNextLine()) {
                        String str = s.nextLine();
                        zweiterTeil = str.split("(\\d+)(\\.\\d+){3}")[1];
                        text.append(zweiterTeil);
                        text.append("\n");
                        mat = Pattern.compile("(\\d+)(\\.\\d+){3}").matcher(str);
                        while (mat.find()) {
                            ip = mat.group(0).toString();
                            traverse(jTree1);
                            if(found){
                                IPNode ipNode = (IPNode) currentValue.getUserObject();
                                ipNode.addContents(zweiterTeil);
                            }else{
                                root.add(new DefaultMutableTreeNode(new IPNode(ip, zweiterTeil)));
                            }
                        }
                    }
                    jTree1.expandRow(0);
                    jScrollPane1 = new JScrollPane(text);
                    jSplitPane1.add(jScrollPane1, JSplitPane.RIGHT);
                    jTree1.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
                        public void valueChanged(TreeSelectionEvent e) {
                            TreePath path = e.getNewLeadSelectionPath();
                            DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
                            String testNode = node.toString();
                            Object userNode = node.getUserObject();
                            if(userNode instanceof IPNode){
                                IPNode ipNode = (IPNode) userNode;
                                text.setText( ipNode.getContents() );
                            }
                            System.out.println(testNode);
                        }
                    });
                    jScrollPane2 = new JScrollPane(jTree1);
                    jSplitPane1.add(jScrollPane2, JSplitPane.LEFT);
                    // Grösse der linken Seite einstellen
                    jSplitPane1.setDividerLocation(0.2);
                }
            }
            {
                menuLeiste = new JMenuBar();
                setJMenuBar(menuLeiste);
                menuLeiste.setPreferredSize(new Dimension(785, 27));
                {
                    fileMenu1 = new JMenu();
                    menuLeiste.add(fileMenu1);
                    fileMenu1.setText("File");
                    {
                        openMenuItem1 = new JMenuItem();
                        fileMenu1.add(openMenuItem1);
                        openMenuItem1.setText("open");
                        openMenuItem1.addActionListener(new Ereignis());
                    }
                    {
                        jSeparator1 = new JSeparator();
                        fileMenu1.add(jSeparator1);
                    }
                    {
                        exitMenuItem2 = new JMenuItem();
                        fileMenu1.add(exitMenuItem2);
                        exitMenuItem2.setText("exit");
                        exitMenuItem2.addActionListener(new Ereignis());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //BufferedWriter schliessen
        try {
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //Scanner schliessen
        s.close();
    }
    public class Ereignis implements ActionListener {
        //Create a file chooser
        final JFileChooser fc = new JFileChooser("c:/Test");
        public void actionPerformed(ActionEvent e) {
            //Handle open button action.
            if (e.getSource() == openMenuItem1) {
                int returnVal = fc.showOpenDialog(NewJFrame.this);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
                    System.out.println(file.getAbsolutePath());
                } else
                    System.out.println("Auswahl abgebrochen");
                //System.exit(1);
            }
            if (e.getSource() == exitMenuItem2) {
                //Close window
                dispose();
                System.exit(0);
            }
            if (e.getSource() == searchButton1) {
                ip = jTextField1.getText();
                System.out.println(ip);
                traverse(jTree1);
                if(found){
                    IPNode ipNode = (IPNode) currentValue.getUserObject();
                    text.setText( ipNode.getContents() );
                    jTree1.setSelectionPath(new TreePath(currentValue.getPath()));
                }
            }
        }
    }
    /*
     * Die Methoden "traverse" und "walk" dienen dazu den Baum zu durchlaufen
     * um eine bestimmte IP Addresse zu finden
     */
    public void traverse(JTree tree) {
        found = false;
        TreeModel model = tree.getModel();
        if (model != null) {
            Object root = model.getRoot();
            walk(model,root);
        } else
            System.out.println("Tree is empty.");
    }
    protected void walk(TreeModel model, Object o){
        int  cc;
        cc = model.getChildCount(o);
        LOOP: for( int i=0; i < cc; i++) {
            DefaultMutableTreeNode child = (DefaultMutableTreeNode) model.getChild(o, i );
            if (model.isLeaf(child) ){
                TreeNode[] ar = child.getPath();
                for (int j = 0; j < ar.length; j++) {
                    currentValue = (DefaultMutableTreeNode) ar[j];
                    if(currentValue.getUserObject() instanceof IPNode){
                        IPNode ipNode = (IPNode)currentValue.getUserObject();
                        String ipS = ipNode.getIp();
                        if(ipS.equals(ip)){
                            found = true;
                            break LOOP;
                        }
                    }
                }
            }else {
                walk(model,child );
            }
        }
    }
}
/*
 * IPNode
 *
 * kapselt die IP Addresse zusammen mit einer Liste der entsprechenden Seiteninhalte
 */
class IPNode{
    private String ip;
    private List<String> contents = new ArrayList<String>();
    public IPNode(String ip, String contents){
        this.ip = ip;
        addContents(contents);
    }
    public void addContents(String contents) {
        this.contents.add(contents);
    }
    public String getContents() {
        StringBuffer buf = new StringBuffer();
        for (String elem : contents) {
            buf.append(elem);
            buf.append("\n");
        }
        return buf.toString();
    }
    public String getIp() {
        return ip;
    }
    public String toString() {
        return ip;
    }
}
```


----------



## Lenzen (18. Jun 2007)

Ich bedanke mich ganz herzlich für die schnelle Hilfe. So schön hätte ich das Programm sicher nicht fertig bekommen. Und alles funktioniert so wie ich es gern haben wollte. :lol:  *ju hu*
Nun kann ich endlich auf dem Server die Log-Dateien besser auswerten.


----------



## André Uhres (4. Aug 2007)

Lenzen hat gesagt.:
			
		

> ..Habe nun das Problem, wenn ich mit dem FileChooser eine neue Datei wähle wird der Tree nicht aktualisiert (bzw. das Programm).
> 
> Ich habe bisher keine Möglichkeit gefunden, um dies zu realisieren. Wer kann mir helfen?
> 
> ...


Versuch mal, mit SwingUtilities.invokeLater einen reload vom Model zu machen:

```
...
public class NewJFrame extends JFrame {
...
    private void initGUI() throws FileNotFoundException, IOException {
...
                    jTree1.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
                        public void valueChanged(TreeSelectionEvent e) {
                            TreePath path = e.getNewLeadSelectionPath();
                            if(path==null)return ;//<------------- der reload nimmt die Selektion weg!
...
                        }
                    });
...
    }
...
    public class Ereignis implements ActionListener {
        public void actionPerformed(ActionEvent e) {
...
               Thread loader = new FileLoader(file, new PlainDocument());
               loader.start();               
               SwingUtilities.invokeLater(new Runnable() {
                   public void run() {
                       ((DefaultTreeModel)jTree1.getModel()).reload(root);//<-----------------------
                   }
               });
...
        }
    }
...
}
```


----------



## LordTerra (6. Aug 2007)

jaja wieder so nen bösser admin der die leute überwachen will *ggg*


----------



## Lenzen (6. Aug 2007)

Funktioniert schon so wie ich es mir vorstelle. 
Das Problem nun ist, dass ich erst nach dem zweiten Mal öffnen der Datei die Baumaktualisierung sehe und alle Einträge auf der "rechten Seite" dann doppelt vorhanden sind.




@ LordTerra


			
				LordTerra hat gesagt.:
			
		

> jaja wieder so nen bösser admin der die leute überwachen will *ggg*



Ich beabsichtige keine Leute zu überwachen.


----------



## André Uhres (6. Aug 2007)

Lenzen hat gesagt.:
			
		

> ..Das Problem nun ist, dass ich erst nach dem zweiten Mal öffnen der Datei die Baumaktualisierung sehe und alle Einträge auf der "rechten Seite" dann doppelt vorhanden sind...


Achso, ich dachte, du würdest eine zweite Datei öffnen, die die erste ergänzt.
Wenn die neue Datei enfach die alte ersetzt, dann musst du natürlich, die bereits geladenen Daten zuerst löschen.
Für den JTree würde das zum Beispiel so gehen:

```
// Handle open button action.
            if (e.getSource() == openMenuItem1) {
                int returnVal = fc.showOpenDialog(NewJFrame.this);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
                    root = new DefaultMutableTreeNode("DataToFind");//<---------------
                    jTree1.setModel(new DefaultTreeModel(root));    //<---------------
```


----------



## Lenzen (6. Aug 2007)

André Uhres hat gesagt.:
			
		

> Achso, ich dachte, du würdest eine zweite Datei öffnen, die die erste ergänzt.
> Wenn die neue Datei enfach die alte ersetzt, dann musst du natürlich, die bereits geladenen Daten zuerst löschen.
> Für den JTree würde das zum Beispiel so gehen:



Ich wollte schon gern die alte Datei um den Inhalt der neuen im Baum ergänzen. Das hattest du schon richtig verstanden. 
Nur das Problem anders ausgedrückt: 
- wenn ich auf File -> Open -> ...(test.log wähle)   ------> es erfolgt keine Aktualisierung
- wenn ich nun ein erneutes Mal auf File -> Open -> ...(test.log wähle)  --------> (selbe Datei) wird der Baum ergänzt und die Einträge auf der "rechten Seite" erscheinen doppelt   

[wenn beim 2. Mal einfach eine andere log-Datei gewählt wird erscheint folgendes: Exception in thread "Thread-4" java.lang.IllegalStateException: No match available
	at java.util.regex.Matcher.end(Matcher.java:365)
	at LogFileAuswerten_1.NewJFrame$Einlesen.einlesen(NewJFrame.java:252)
	at LogFileAuswerten_1.NewJFrame$FileLoader.run(NewJFrame.java:362)]


----------



## Lenzen (8. Aug 2007)

So habe jetzt eine Lösung des Problems gefunden. Liegt daran das die Daten noch nicht da sind bevor der Baum aufgebaut wird. Habe das ganze jetzt sysnconisiert. 
Der Code:



```
public class Ereignis implements ActionListener {                 
        public void actionPerformed(ActionEvent e) {
...
                    if (returnVal == JFileChooser.APPROVE_OPTION) {
					File file = fc.getSelectedFile();				
					final Thread loader = new FileLoader(file, new PlainDocument());					
					//starting loader and calling wait() for thread loader
					synchronized(loader) {           //<------------------------------------------------
		                try {
		                	loader.start();		
		                	loader.wait();
		                } catch (InterruptedException ex) {}
		            } 					
					
					// Wird erst aufgerufen, wenn alle Aufgaben abgearbeitet wurden	
					SwingUtilities.invokeLater(new Runnable() {
		                   public void run() {		  
		                	  // notifying all threads of this class
		                	   synchronized(loader) {      //<------------------------------------------------
		                	   loader.notify();
		                	   }
		                       ((DefaultTreeModel)jTree1.getModel()).reload(root);		                      
		                   }
		               });     		
...
         }
  }
```


----------



## Lenzen (29. Okt 2007)

Nachdem ich mein kleines Programm etwas erweitert habe, funktioniert das aneinander hängen des nächsten Einlesevorgangs nicht mehr.  
Ich habe das einlesen über eine xml Datei eingebaut.
Das leidige Synchronisationsproblem ist leider immer noch nicht abgeschlossen. Wer kann mir hier helfen?


```
package LogFileAuswerten_XML;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;


public class NewJFrame extends JFrame {
 
	private static final long serialVersionUID = -378063720927050537L;
	private JMenuBar menuLeiste;
    private JTextField jTextField1;
    private JMenu fileMenu1;   
    private JButton searchButton1;
    private JLabel chooseLabel1;   
    private JSplitPane jSplitPane1;
    private JScrollPane jScrollPane1;
    private JScrollPane jScrollPane2;
    private JMenuItem exitMenuItem2;
    private JSeparator jSeparator1;
    private JMenuItem openMenuItem1;
    private JProgressBar jProgressBar1;  
    private JPanel panel1;
    private JPanel panel2;
    private DefaultMutableTreeNode root = new DefaultMutableTreeNode("DataToFind"); 
    private JTree jTree1;
    private String ip = "";   
    private long erg; 
    private JTextArea text;
    private boolean found;
    private DefaultMutableTreeNode currentValue;  
    public String PATH = "";
    static String OUTFILE = "c:\\Test\\TestWrite.txt";
    static String suchwort = "2007-07-17 17:38:56.765";
   
 
//----------------------- Regex -----------------------------------------------------------------          
    /**    
     *  1. Regex Teil trifft z.B. 07/30/2007,08:43:38.256
     *  2. Regex Teil trifft z.B. 2007-07-17 17:38:57.625
     *  3. Regex Teil trifft z.B. trifft IP-Adressen
     *  4. Regex Teil trifft z.B. 13:32:18.0781 
     */  
    
	// Regex zusammen
    static String REGEX = 
      "(\\d+\\/\\d+\\/\\d+\\W?\\s?\\d+[:/.]\\d+[:/.]\\d+([./.]\\d+)?)|" +
	  "((20)\\d+([- /.])\\d+([-/.])\\d+(\\s)\\d+[:/.]\\d+[:/.]\\d+[./.]\\d+)|" +
	  "((\\d+)(\\.\\d+){3})|" +
	  "\\d+[:/.]\\d+[:/.]\\d+([./.]\\d+)\\s";
    Pattern pat= Pattern.compile(REGEX);
//-------------------------------------------------------------------------------------------------	

    
	       		        
	 
    
    public static void main(String[] args) throws IOException{
        NewJFrame inst;       
		try {
			inst = new NewJFrame();
			inst.setVisible(true);
		} catch (IOException e1) {					
			JOptionPane.showMessageDialog(null, "Error Reason:\n" +
					e1.getMessage()+
					"\n\nCan't find file! Wrong file choose in xml file." +
					"\nPush OK to choose the logfile", "FileNotFoundError",0);
			JFileChooser fc = new JFileChooser("c:/Test");
			fc.showOpenDialog( null ); 
			File file = fc.getSelectedFile();	
			if(file != null){ // hier wurd im File Chooser abgebrochen
				String s = file.toString();				
				inst = new NewJFrame(s);
				inst.setVisible(true);	
			}
		}  
        
    }
    public NewJFrame() throws FileNotFoundException, IOException {
        super();
        XML_Parser p = new XML_Parser();     	
		try {
			PATH = p.getPath();
		} catch (Exception eXML) {}	
        initGUI(PATH);
    }
    public NewJFrame(String s) throws FileNotFoundException, IOException {
        super();
        initGUI(s);            
    }
   
    private void initGUI(String PATH) throws FileNotFoundException, IOException {   
    				
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(PATH)));
//        this.fstream = new FileWriter(OUTFILE);
//        this.out = new BufferedWriter(fstream);
        setTitle("Search for Data in LogFiles");
        setSize(872, 772);
        this.setLayout(new BorderLayout());     
        panel1 = new JPanel(new GridLayout(1,2));         
        try {
            // Close window
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            {
                jTextField1 = new JTextField();                            
                jTextField1.setText("");                  
                panel1.add(jTextField1);           
            }
            {
                chooseLabel1 = new JLabel();               
                chooseLabel1.setText("Choose the Data");               
                panel1.add(chooseLabel1);                 
            }
            {
                searchButton1 = new JButton();               
                searchButton1.setText("Search");
                searchButton1.setSize(28, 7);
                panel1.add(searchButton1);                
                getContentPane().add(panel1, BorderLayout.NORTH);
                searchButton1.addActionListener(new Ereignis());
            }
            {
                jSplitPane1 = new JSplitPane();
                getContentPane().add(jSplitPane1, BorderLayout.CENTER);               
                {
                    text = new JTextArea();                      
                    jTree1 = new JTree(root);                    
                    long startTime = System.currentTimeMillis(); 
                    Einlesen es1 = new Einlesen();   
                    es1.einlesen(br, root);
                    //es1.einlesen(s, root);
                    long endTime = System.currentTimeMillis();                    
                    erg = (endTime-startTime);                       
                    jTree1.expandRow(0);
                    jScrollPane1 = new JScrollPane(text);
                    jSplitPane1.add(jScrollPane1, JSplitPane.RIGHT);                   
                    jTree1.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
                        public void valueChanged(TreeSelectionEvent e) {
                            TreePath path = e.getNewLeadSelectionPath();                            
                            if(path==null)return ;//<------------- der reload nimmt die Selektion weg!
                            DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
                            //String testNode = node.toString();
                            Object userNode = node.getUserObject();
                            if(userNode instanceof IPNode){
                                IPNode ipNode = (IPNode) userNode;
                                text.setText(ipNode.getContents());                                 
                            }
                            //Ausgabe des Baum Klicks
                            //System.out.println(testNode);
                        }
                    });                   
                    jScrollPane2 = new JScrollPane(jTree1);
                    // Grösse der linken Seite einstellen
                    jSplitPane1.setDividerLocation(0.3);
                    jSplitPane1.add(jScrollPane2, JSplitPane.LEFT);
                    
                }
            }            
			{
				panel2 = new JPanel(new GridLayout(1,2)); 
				jProgressBar1 = new JProgressBar(0, (int)erg*30);		
				jProgressBar1.setValue(0);
				jProgressBar1.setStringPainted(true);
				panel2.add(jProgressBar1); 				
				getContentPane().add(panel2, BorderLayout.SOUTH);
//----------------------------- Statusanzeige -------------------------------------------
                new Thread(new Runnable() {
					public void run() {
						for (int i = 1; i <= jProgressBar1.getMaximum(); ++i) {
							final int j = i;
							SwingUtilities.invokeLater(new Runnable() {
										public void run() {
											jProgressBar1.setValue(j);
										}
									});
						}
					}
				}).start();
//----------------------------------------------------------------------------------------  
			}
			{
            	
				chooseLabel1 = new JLabel();				
				chooseLabel1.setText(" Status of Time to read the data from File");
				panel2.add(chooseLabel1); 				
			}
            {
                menuLeiste = new JMenuBar();
                setJMenuBar(menuLeiste);
                menuLeiste.setPreferredSize(new Dimension(785, 27));
                {
                    fileMenu1 = new JMenu();
                    menuLeiste.add(fileMenu1);
                    fileMenu1.setText("File");
                    {
                        openMenuItem1 = new JMenuItem();
                        fileMenu1.add(openMenuItem1);
                        openMenuItem1.setText("open");
                        openMenuItem1.addActionListener(new Ereignis());
                    }
                    {
                        jSeparator1 = new JSeparator();
                        fileMenu1.add(jSeparator1);
                    }
                    {
                        exitMenuItem2 = new JMenuItem();
                        fileMenu1.add(exitMenuItem2);
                        exitMenuItem2.setText("exit");
                        exitMenuItem2.addActionListener(new Ereignis());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //BufferedWriter schliessen
/*       try {
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
        
        //BufferedReader schliessen
        br.close();
    }
    
    /*
     * Die Methoden "traverse" und "walk" dienen dazu den Baum zu durchlaufen
     * um eine bestimmte IP Addresse zu finden
     */
    public void traverse(JTree tree) {
        found = false;
        TreeModel model = tree.getModel();
        if (model != null) {
            Object root = model.getRoot();
            walk(model,root);
        } else
            System.out.println("Tree is empty.");
    }
    protected void walk(TreeModel model, Object o){
        int  cc;
        cc = model.getChildCount(o);
        LOOP: for( int i=0; i < cc; i++) {
            DefaultMutableTreeNode child = (DefaultMutableTreeNode) model.getChild(o, i );
            if (model.isLeaf(child) ){
                TreeNode[] ar = child.getPath();
                for (int j = 0; j < ar.length; j++) {
                    currentValue = (DefaultMutableTreeNode) ar[j];
                    if(currentValue.getUserObject() instanceof IPNode){
                        IPNode ipNode = (IPNode)currentValue.getUserObject();
                        String ipS = ipNode.getIp();
                        if(ipS.equals(ip)){
                            found = true;
                            break LOOP;
                        }
                    }
                }
            }else {
                walk(model,child );
            }
        }
    }
    class Einlesen{
    	
    	private String zweiterTeil = "";   	
    	
    	public void einlesen(BufferedReader br, DefaultMutableTreeNode root) throws IOException{     
    		String str;    		
    		while ((str=br.readLine())!= null) {          			
             //------------------------------beim erneuten öffnen aktiv-----------   	
                	//text.setText(zweiterTeil);
                	//text.append(zweiterTeil);
                	//text.append("\n");
                //}
    			// 	versucht, den ganzen input mit dem Muster zu matchen
    		    Matcher mat = pat.matcher(str);       
                while(mat.find()) {                	
                    // ip = mat.group(0).toString();
                    ip = str.substring(mat.start(), mat.end());
                	//System.out.println(ip);
                    zweiterTeil = str.substring(mat.end());                  
                    //----doppelte Daten werden zusammengefasst----
                    traverse(jTree1);
                    if(found){
                        IPNode ipNode = (IPNode) currentValue.getUserObject();
                        ipNode.addContents(zweiterTeil);                       
                    }else{                    	
                        root.add(new DefaultMutableTreeNode(new IPNode(ip, zweiterTeil)));                       
                    }
                }                
            }    	
    		 DefaultMutableTreeNode child;
             child = new DefaultMutableTreeNode("next File ...");
             root.add(child);             
    	}
    }
    
    public class Ereignis implements ActionListener {                 
    	
        public void actionPerformed(ActionEvent e) {
        	// Create a file chooser
            JFileChooser fc = new JFileChooser("d:/Test");              
            // Handle open button action.
            if (e.getSource() == openMenuItem1) {
                int returnVal = fc.showOpenDialog(NewJFrame.this);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();            
                    final Thread loader = new FileLoader(file, new PlainDocument());               
                    //starting loader and calling wait() for thread loader
                    synchronized(loader) {           //<------------------------------------------------
                           try {
                              loader.start();      
                              loader.wait();                                 
                           } catch (InterruptedException ex) {}
                       }                
                    
                    // Wird erst aufgerufen, wenn alle Aufgaben abgearbeitet wurden   
                    SwingUtilities.invokeLater(new Runnable() {
                              public void run() {       
                                // notifying all threads of this class
                                 synchronized(loader) {      //<------------------------------------------------
                                 loader.notify();
                                 }
                                  ((DefaultTreeModel)jTree1.getModel()).reload(root);                           
                              }
                          });   
					setVisible(true);									
				} else
                    System.out.println("Auswahl abgebrochen");
                //System.exit(1);
            }
            if (e.getSource() == exitMenuItem2) {
                //Close window
                dispose();
                System.exit(0);
            }
            if (e.getSource() == searchButton1) {
                ip = jTextField1.getText();
                //System.out.println(ip);                
                traverse(jTree1);
                if(found){
                    IPNode ipNode = (IPNode) currentValue.getUserObject();                   
                    text.setText( ipNode.getContents() );
                    jTree1.setSelectionPath(new TreePath(currentValue.getPath()));
                }                    
                searchButton1.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                      for (int i = 0; i > 1000; i++) {
                          // Als Beispiel für eine
                          // rechenintensive Operation
                          try { Thread.sleep(1000); } 
                           catch (InterruptedException ex) {}
                          jProgressBar1.setValue(i);
                      }
                    }});                
            }
        }
    }
/**
 * 
 * Datei wird im Hintergrund nachgeladen,
 * somit können auch große Datein schnell geöffnet werden.
 */   
    
    class FileLoader extends Thread {

		Document doc;
		File f;

		FileLoader(File f, Document doc) {
			setPriority(5);
			this.f = f;
			this.doc = doc;
		}

		public void run() {
			try {						
				// try to start reading
				Reader in = new FileReader(f);
				char[] buff = new char[4096];
				int nch;					
				while ((nch = in.read(buff, 0, buff.length)) != -1) {
					doc.insertString(doc.getLength(), new String(buff, 0, nch),	null);									
				}				
				BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
				Einlesen es = new Einlesen();				
				es.einlesen(br, root);					
				// BufferedReader schliessen
				br.close();
			} catch (Exception e) {} 
		}
		
	}
}

/**
 * IPNode
 * 
 * kapselt die IP Addresse zusammen mit einer Liste der entsprechenden
 * Seiteninhalte
 */
class IPNode {
	private String ip;
	private List<String> contents = new ArrayList<String>();

	public IPNode(String ip, String contents) {
		this.ip = ip;
		addContents(contents);
	}

	public void addContents(String contents) {
		this.contents.add(contents);
	}

	public String getContents() {
		StringBuilder bu = new StringBuilder();
		for (String elem : contents) {
			bu.append(elem);
			bu.append("\n");
		}
		return bu.toString();
	}

	public String getIp() {
		return ip;
	}

	public String toString() {
		return ip;
	}
}
```


```
package LogFileAuswerten_XML;

import java.io.File;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.xml.parsers.*;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class XML_Parser {	
	
	private String s = "";
	
	
	public String getPath() throws ParserConfigurationException{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = null;
		try {
			document = builder.parse(new File("SetPath.xml"));
		} catch (IOException e1) {		
			JOptionPane.showMessageDialog(null, e1.getMessage()+
					"\n\nCan't find xml file! " +
					"\nPush OK to choose the logfile", "FileNotFoundError",0);
			JFileChooser fc = new JFileChooser("c:/Test");
			fc.showOpenDialog( null ); 
			File file = fc.getSelectedFile();
			s = file.toString();
			return s;
		} catch (SAXException e) {			
			return e.getMessage();
		}	 	
		s = document.getFirstChild().getTextContent().trim();		
		return s;
	}	
	
}
```


```
<?xml version="1.0" ?> 
<SetPath> 
    <first> 
        <path>D:\Test\kurz.log</path>                
    </first>         
</SetPath>
```


----------



## André Uhres (30. Okt 2007)

Upps, siehe Folgepost..


----------



## André Uhres (30. Okt 2007)

Lenzen hat gesagt.:
			
		

> ..funktioniert das aneinander hängen des nächsten Einlesevorgangs nicht mehr..


Bitte beschreib dein Problem genauer.
Wir wissen zwar jetzt, dass es um "das aneinander hängen des nächsten Einlesevorgangs" geht,
 und dass dabei irgendetwas nicht funktioniert, aber was genau ist das Fehlverhalten?  ???:L 

Du kannst auch Testdateien hochladen: Eigene Dateien und den Link darauf hier posten.
Das wird die Fehlersuche ungemein erleichtern.


----------



## Lenzen (30. Okt 2007)

Wenn ich eine Datei einlese wird diese ganz normal eingelesen. Den Abschluss des Baums bildet der Eintrag "next File ..." 
Will ich aber nun eine weitere Datei einlesen, wird mir der Inhalt nicht angezeigt, sondern nur mein Abschluss unter den bereits bestehenden gesetzt. 
Ich habe deinen Link benutzt, um die 3 Dateien hochzuladen. Hätte gern noch ein Bildschirmdruck eingefügt --> das funktionierte aber leider nicht.

Ich versuche das mal darzustellen. 

_Data to find_
      :         
      :---10.12.1.3
      :---10.23.2.7
      :---10.34.7.1
      :---next File ...
      :---next File ...

Nach dem ersten einlesen wird der Baum richtig aufgebaut und "next File ..." angehängt. Das erneute einlesen über den File Chooser, erweitert den Baum leider nur um meinen Abschluss.


----------



## André Uhres (30. Okt 2007)

Lenzen hat gesagt.:
			
		

> ..Ich habe deinen Link benutzt, um die 3 Dateien hochzuladen..


Da kommen wir so nicht dran. Du muss schon den Link zu jeder Datei posten :wink:
Beispiel: http://www.java-forum.org/de/userfiles/user3690/myarraydemo.xml


----------



## Lenzen (30. Okt 2007)

Datei_1:
http://www.java-forum.org/de/userfiles/user7876/SetPath.xml

Datei_2:
http://www.java-forum.org/de/userfiles/user7876/XML_Parser.java

Datei_3:
http://www.java-forum.org/de/userfiles/user7876/NewJFrame.java

Hab nun einen Screenshot von der GUI mit hinterlegt: 
http://www.java-forum.org/de/userfiles/user7876/GUI.JPG


----------



## André Uhres (30. Okt 2007)

Lenzen hat gesagt.:
			
		

> Datei_1:
> http://www.java-forum.org/de/userfiles/user7876/SetPath.xml
> 
> Datei_2:
> ...


Achso, ich dachte das wären Testdaten. So hilft das auch nicht weiter :wink:


----------



## Lenzen (30. Okt 2007)

----------------------------------------------------------------------------------------
**ergänzt um die Testdaten**
---------------------------------------------------------------------------------------
http://www.java-forum.org/de/userfiles/user7876/kurz.log

http://www.java-forum.org/de/userfiles/user7876/kuerzer.log


----------



## André Uhres (30. Okt 2007)

Lenzen hat gesagt.:
			
		

> .. Das erneute einlesen über den File Chooser, erweitert den Baum leider nur um meinen Abschluss.


Ich würde sagen: erweitert den Baum *glücklicherweise* nur um den Abschluss, denn

```
//----doppelte Daten werden zusammengefasst----
```
Jedenfalls sind in den Testdateien die IP Adressen doppelt :wink:


----------



## Lenzen (30. Okt 2007)

Oh je.... denn hab ich aufgrund meiner "tollen Testdaten" das nicht machen können. :roll: 

Sorry nochmal! Dann geht ja doch alles. 
Oh man, dann hätte ich mir und euch allen viel Zeit ersparen können.  

Danke André für deine Hilfe.


----------



## André Uhres (31. Okt 2007)

Lenzen hat gesagt.:
			
		

> ..Dann geht ja doch alles..


Ja, aber man könnte vielleicht den Code etwas "aufräumen".
Hier hab ich mal einen Versuch gestartet: LogFileAuswerten.jar (Quellcode im jar)


----------



## Lenzen (31. Okt 2007)

Danke, dass sieht schon klasse aus. 
Ich finde auch, dass du das Layout besser hinbekommen hast als ich. Nun stimmt auch das Verhältnis von Suchleiste und Button. 
Danke dir André.


----------

