# Auslesen einer XML Datei



## alfonso101 (26. Nov 2005)

Hallo 

Ich habe den folgenden Code geschrieben, um aus einer XML Datei auszulesen, und zwar die Zeilen die mit <Line> </LINE>  begrenzt werden. Das Problem ist, wenn  es mehrere socher Zeilen hintereinander stehen, dann liest das Programm erst die erste Zeile, warum? Was soll man tun damit man alle solcher Zeilen auslesen kann?!

- <SPEECH> 
<SPEAKER>MARCELLUS</SPEAKER> 
<LINE>Horatio says 'tis but our fantasy,</LINE> 
<LINE>That if again this apparition come,</LINE> 
<LINE>He may approve our eyes and speak to it.</LINE> 
</SPEECH> 

Ein zweites Problem, das ich habe ist: Ich versuche mit Hilfe von  hash map zu zählen , wie Oft ein Wort vorkommt; Bei der Zeile : anInteger = new Integer(Integer.parseInt(anInteger + 1));
zeigt mir der Compiler folgendes?!

//"The operato + is undefined for the argument type Integer, int"


```
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import java.io.File;
import org.w3c.dom.Document;
import org.w3c.dom.*; 
import java.util.StringTokenizer;
import java.util.Hashtable;
import java.util.Map;
import java.util.HashMap;
import java.util.WeakHashMap;
import java.util.TreeMap;
import java.util.Iterator;
import java.lang.Integer;


public class HAMLET {
public static void main(String[] args) {
Map map = new HashMap(); // hash table
map = new TreeMap(); 

// Die Datei aufmachen, und Zeile für Zeile auslesen
try {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse (new File("c:/hamlet.xml"));
doc.getDocumentElement ().normalize ();
NodeList listOfLines = doc.getElementsByTagName("SPEECH");
int r = listOfLines.getLength();


//Für jede Zeile, jedes Wort untersuchen
for(int s=0; s<listOfLines.getLength() ; s++){
Node firstLineNode = listOfLines.item(s);
if(firstLineNode.getNodeType() == Node.ELEMENT_NODE){
Element firstLineElement = (Element)firstLineNode; 
NodeList firstNameList = firstLineElement.getElementsByTagName("LINE");
Element firstNameElement = (Element)firstNameList.item(0);
NodeList textFNList = firstNameElement.getChildNodes();
String LineofFile = ((Node)textFNList.item(0)).getNodeValue().trim();
word_by_word_extraction linedecom = new word_by_word_extraction();
String wordsofline[] = linedecom.wordextraction(LineofFile);
int numwordline = wordsofline.length;
for(int gh = 0; gh><numwordline; gh++)
{

//Portstemmer ist eine Klasse die das Stammwort zurückgibt
PorterStemmer termto = new PorterStemmer();
String returenedterm = termto.stem(wordsofline[gh]);
// ubdating the hash MAP
Integer anInteger ;
StringTokenizer st = new StringTokenizer(returenedterm); 
if (map.containsKey(returenedterm)) // key already in Map
{
anInteger = (Integer)map.get(returenedterm);
//"The operato + is undefined for the argument type Integer, int"
anInteger = new Integer(Integer.parseInt(anInteger + 1));
}
else // key doesn't exist yet.
{
// Create new integer indicating one occurrence.
anInteger = new Integer(1);
}
}
}
}
}
catch (Throwable t) {
t.printStackTrace ();
}
// writing out the hash table
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
String s = (String) it.next();
System.out.println(map.get(s) + "\t" + s);
}
}>
```
Ich Hoffe auf Eure Hilfe,ich habe alles versuch, aber es klappt nicht....


----------



## André Uhres (26. Nov 2005)

```
/*
 * HAMLET_1.java
 */
import java.io.File;
import java.util.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
public class HAMLET_1 {
    public HAMLET_1(){
        File file = new File("c:/hamlet.xml");
        /*
<?xml version="1.0"?>
<HAMLET>
 <SPEECH> 
  <SPEAKER>MARCELLUS</SPEAKER> 
  <LINE>Horatio says 'tis but our fantasy,</LINE> 
  <LINE>That if again this apparition come,</LINE> 
  <LINE>He may approve our eyes and speak to it.</LINE> 
 </SPEECH> 
 <SPEECH> 
  <SPEAKER>ANDRE UHRES</SPEAKER> 
  <LINE>I added the HAMLET tag</LINE> 
  <LINE>Because I think it is needed</LINE> 
  <LINE>To process multiple speeches</LINE> 
 </SPEECH> 
</HAMLET>         
         */
        try {
            DocumentBuilder builder =
                    DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = builder.parse(file);
            
            NodeList speeches = doc.getElementsByTagName("SPEECH");
            for (int i = 0; i < speeches.getLength(); i++) {
                Element speechElement = (Element)speeches.item(i);
                NodeList speakers = speechElement.getElementsByTagName("SPEAKER");
                Element speakerElement = (Element) speakers.item(0);
                String speaker = getCharacterDataFromElement(speakerElement);
                System.out.println("Speaker: " + speaker);
                NodeList lines = speechElement.getElementsByTagName("LINE");
                for (int j = 0; j < lines.getLength(); j++) {
                    Element lineElement = (Element) lines.item(j);
                    String text = getCharacterDataFromElement(lineElement);
                    System.out.println("Line: " + text);
                    String[] words = text.split(" ");
                    for (int k = 0; k < words.length; k++) {
                        String key = words[k];
                        Integer count = map.put(key, new Integer(1) );
                        if(count != null)
                            map.put(key, new Integer((count.intValue() +1)) );
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // writing out the map
        for(String s : map.keySet())
            System.out.println(map.get(s) + "\t" + s);
    }
    public static String getCharacterDataFromElement(Element e) {
        Node child = e.getFirstChild();
        if (child instanceof CharacterData) {
            CharacterData cd = (CharacterData) child;
            return cd.getData();
        }
        return "?";
    }
    public static void main(String[] args) { new HAMLET_1(); }
    private Map<String, Integer> map = new TreeMap<String, Integer>();
}
```


----------



## DP (26. Nov 2005)

alfonso101, ich würde mir mal angewöhnen deinen code einzurücken...


----------



## licht400 (13. Apr 2007)

Hallo!

Möchte in einer xml Datei eine Suchindex anlegen!

den Index habe ich schon im Programm realisiert und funktioniert auch.
aber wie schreibe ich den index in eine xml datei und wie rufe ich diese auf, so dass das ganze weiterhin funktionier?


```
Vector vLink = new Vector();

        Link mylink2 = new Link();
        mylink2.setUrl("bauteilvearbeitung.html");
        mylink2.setInhalt("Seite 1");
        mylink2.setUeberschrift("Bauteilverarbeitung");
        vLink.add(mylink2);
        
        Link mylink3 = new Link();
        mylink3.setUrl("einstellung.html");
        mylink3.setInhalt("Seite 2");
        mylink3.setUeberschrift("Menü Einstellung");
        vLink.add(mylink3);
        .
        .
        .
```

danke schon mal im voraus!


----------



## licht400 (16. Apr 2007)

Versteht keiner was ich will ?? 

wäre lieb, dass mir einer tip gibt, wie ich die xml struktur da anlege und darauf zugreife!


----------



## licht400 (23. Apr 2007)

so sieht die xml aus!
kann mir keiner helfen, wie ich diese einlese ??

```
<?xml version="1.0" encoding="iso-8859-1"?>
<vector>
	<link id="1" url="einfuhrung.html">
		<ueberschrift>Einführung</ueberschrift>
		<inhalt>Programmsystem , Simulation, Quellcode</inhalt>
	</link>
	<link id="2" url="bauteilverbeitung.html">
		<ueberschrift>Bauteilverarbeitung</ueberschrift>
		<inhalt>Seite 1</inhalt>
	</link>
	<link id="3" url="einstellung.html">
		<ueberschrift>Menue Einstellung</ueberschrift>
		<inhalt>Seite 2</inhalt>
	</link>
	<link id="4" url="ergebnissdarstellung.htm">
		<ueberschrift>Menü Ergebnissdarstellung</ueberschrift>
		<inhalt>Seite 3</inhalt>
	</link>
	<link id="5" url="install_java_3d.html">
		<ueberschrift>Installation Java 3D</ueberschrift>
		<inhalt>Seite 4</inhalt>
	</link>
	<link id="6" url="installation_java.html">
		<ueberschrift>Installation Java</ueberschrift>
		<inhalt>kasus</inhalt>
	</link>
	<link id="7" url="vorraussetzung.html">
		<ueberschrift>Vorraussetzungen</ueberschrift>
		<inhalt>Seite 5</inhalt>
	</link>
</vector>
```


----------



## DP (23. Apr 2007)

andre uhres hat doch schon code gepostet...


----------



## licht400 (23. Apr 2007)

kann ich das genau auf meines übertragen?
ich schau es mir mal an!


----------



## licht400 (24. Apr 2007)

kann ich die xml datei überhaupt in meine Link classe einlesen, so dass es aussieht, wie als wäre es im prgramm?

so sah es im prgramm aus:

```
Vector vLink = new Vector();

        Link mylink2 = new Link();
        mylink2.setUrl("bauteilvearbeitung.html");
        mylink2.setInhalt("Seite 1");
        mylink2.setUeberschrift("Bauteilverarbeitung");
        vLink.add(mylink2);
       
        Link mylink3 = new Link();
        mylink3.setUrl("einstellung.html");
        mylink3.setInhalt("Seite 2");
        mylink3.setUeberschrift("Menü Einstellung");
        vLink.add(mylink3);
```

und die XML ist drüber.

und diese würde ich gerne einlesen, so das meine Link klasse wieder gefüllt wird.


----------



## André Uhres (24. Apr 2007)

```
File file = new File("c:/xmlTest.xml");
        Vector<Link> vLink = new Vector<Link>();
        try {
            DocumentBuilder builder =
                    DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = builder.parse(file);
            NodeList links = doc.getElementsByTagName("link");
            for (int i = 0; i < links.getLength(); i++) {
                Link mylink2 = new Link();
                Element linkElement = (Element)links.item(i);
                String id = linkElement.getAttribute("id");
                String url = linkElement.getAttribute("url");
                mylink2.setId(id);
                mylink2.setUrl(url);
                NodeList ueberschrift = linkElement.getElementsByTagName("ueberschrift");
                Element ueberschriftElement = (Element) ueberschrift.item(0);
                String title = getCharacterDataFromElement(ueberschriftElement);
                mylink2.setUeberschrift(title);
                NodeList inhalt = linkElement.getElementsByTagName("inhalt");
                Element inhaltElement = (Element) inhalt.item(0);
                String text = getCharacterDataFromElement(inhaltElement);
                mylink2.setInhalt(text);
                vLink.add(mylink2);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
```


----------



## licht400 (25. Apr 2007)

danke!

Kannst du mir mal sagen, welche imports ich da benötige, da er mir einige Feher bringt.

danke!

edit:

was bedeuetet wenn der mir anzeigt bei string id


"cannot find symbol"
"symbol: method getAttribute(java.lang.String)"
"location: interface org.dom4j.Element"

irgendwas ist da durcheinander. aber was muss ich da wie ändern?


----------



## André Uhres (25. Apr 2007)

licht400 hat gesagt.:
			
		

> ..Kannst du mir mal sagen, welche imports ich da benötige..




```
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
```


----------



## licht400 (25. Apr 2007)

danke kannst mir aber zu dem fehler den ich im edit geschrieben habe, was sagen!

kommen dadie import durcheinander oder in konflikt und wie ich die probleme behebe?


edit :


und er sagt mir, dass ich getCharacterDataFromElement , davon eine methode schreiben soll, da es diese noich nicht gibt!

aber diese hast du ja auch nicht geschrieben und nur aufgerufen!


----------



## André Uhres (25. Apr 2007)

licht400 hat gesagt.:
			
		

> danke kannst mir aber zu dem fehler den ich im edit geschrieben habe, was sagen!
> kommen dadie import durcheinander oder in konflikt und wie ich die probleme behebe?


Der Fehler bedeutet, daß ein import fehlt. Mit den imports, die ich dir angegeben haben müsste es funktionieren.


----------



## licht400 (25. Apr 2007)

mhh nagut, ich glaube es liegt darin,dass mein jtree menu was ich gemacht habe, auf SAX läuft oder?
doof..ja mit deinen imports klappt es, nur dann nicht mit dem code, den ich für dass jtree menu habe :/

(aber denoch zu deinem code, sagt er mir(auch mit deinen imports), dass *getCharacterDataFromElement* selber schreiben muss)

jtree code 


```
SAXReader reader = new SAXReader();
        Document doc = reader.read("menu.xml");
        Element used = doc.getRootElement();
        DefaultMutableTreeNode intro = new DefaultMutableTreeNode(used.getName());
        appendChilds(used, intro);
        tree = new JTree(intro);
```


```
public static void appendChilds(Element used, DefaultMutableTreeNode intro) {
        List childs = used.elements();
        
        for (int i=0; i<childs.size(); i++) {
            Element e = (Element) childs.get(i);
            DefaultMutableTreeNode install = new DefaultMutableTreeNode(e.getName());
            intro.add(install);
            appendChilds(e, install);
        }
    }
```


----------



## André Uhres (25. Apr 2007)

licht400 hat gesagt.:
			
		

> ..aber denoch zu deinem code, sagt er mir(auch mit deinen imports), dass *getCharacterDataFromElement* selber schreiben muss..


Ja, sorry, das hatte ich ganz übersehen:

```
public static String getCharacterDataFromElement(Element e) {
        Node child = e.getFirstChild();
        if (child instanceof CharacterData) {
            CharacterData cd = (CharacterData) child;
            return cd.getData();
        }
        return "?";
    }
```
Steht aber auch schon im HAMLET Beispiel oben.


----------



## licht400 (25. Apr 2007)

stimmt habe ich grad nochmal durchgeschaut!danke!

ist es eigentlich gut wenn ich mein jtree mit dem SaxReader auslese, da wenn ich die imports hinzufüge, die es benötigt

import org.dom4j.io.SAXReader;

kommt dann bei 

Document doc = reader.read("menu.xml");

"incompatible types
"found org.dom4j.Document
"required org.w3c.dom.Document

obwohl ich die imports drin habe!merkwürdig!

nagut, ich teste mal weiter und danke für dein HILFE!


----------



## André Uhres (25. Apr 2007)

Wenn es zwischen zwei packages Überschneidungen gibt (gleiche Klassennamen in verschiedenen packages), dann musst du die betroffenen Klassen explizit importieren (also den vollständigen Pfad zur Klasse angeben, ohne *).


----------



## licht400 (25. Apr 2007)

jep das habe ich getan!
jetz sagt er mir hier.


```
public static void appendChilds(Element used, DefaultMutableTreeNode intro) {
        List childs = used.elements(); <-------------------------hier1
        
        for (int i=0; i<childs.size(); i++) {
            Element e = (Element) childs.get(i);
            DefaultMutableTreeNode install = new DefaultMutableTreeNode(e.getName());<-------------------hier2
            intro.add(install);
            appendChilds(e, install);
        }
    }
```

hier1:"symbol: methode elements()
        " location: interface org.w3c.dom.Element

hier2: "symbol: methode getName()
         "location: interface org.w3c.dom.Element

das ist das einzigste was ich jetz nich weg bekomme mehr!


----------



## André Uhres (25. Apr 2007)

Ersetz in dieser Methode "Element" durch sowas:"meinpackagename.Element",
das heisst, du gibst den vollständigen Klassennamen samt Package an.


----------



## licht400 (25. Apr 2007)

wenn ich ds richtig verstanden habe, habe ich das jetze so gemacht!

alte zeile:
public static void appendChilds(Element used, DefaultMutableTreeNode intro)

neue Zeile:
public static void appendChilds(org.w3c.dom.Element used, DefaultMutableTreeNode intro)

aber immer noch die 2 fehler wie oben beschrieben!


----------



## André Uhres (25. Apr 2007)

Und du bist sicher, daß "org.w3c.dom.Element" das richtige package angibt?
Oder hast du vielleicht eine eigene Klasse, die auch Element heisst?


----------



## licht400 (25. Apr 2007)

ja bin mir sicher.
jetz habe ich es soweit!
nur noch der fehler bei e.getName()

"symbol  : method getName()
"location: interface org.w3c.dom.Element
            DefaultMutableTreeNode install = new  
                  DefaultMutableTreeNode(e.getName());




```
public static void appendChilds(org.dom4j.Element used, javax.swing.tree.DefaultMutableTreeNode intro) {
        List childs = used.elements();
        
        for (int i=0; i<childs.size(); i++) {
            Element e = (Element) childs.get(i);
            DefaultMutableTreeNode install = new DefaultMutableTreeNode(e.getName());
            intro.add(install);
            appendChilds((org.dom4j.Element) e, (javax.swing.tree.DefaultMutableTreeNode) install);
        }
    }
```


----------



## André Uhres (25. Apr 2007)

org.dom4j.Element e = org.dom4j.Element) childs.get(i);


----------



## licht400 (25. Apr 2007)

danke, aber warum lag es an dem element?


----------



## André Uhres (25. Apr 2007)

Sowohl "org.w3c.dom.Element" als auch "org.dom4j.Element" sind durch die imports zugänglich gemacht worden. Daher muss man angeben, welche der beiden Element-Klassen gemeint ist.


----------



## licht400 (25. Apr 2007)

achso, danke 

ach, nur so nebenbei!

wenn ich rausfinden will, dass Link leer ist einfach 
if (Links != 0){

}

else System.out.println("Nicht vorhanden");

oder?


----------



## André Uhres (25. Apr 2007)

Du meint wohl den Vector:

```
if(vLink.isEmpty()){
            //leer
        }
```


----------



## Zed (25. Apr 2007)

Schau dir mal http://www.castor.org/ an. 
Ist ein recht angenehm zu bedienendes XML -Framework.


----------



## licht400 (26. Apr 2007)

danke ihr 2!

ja meinte vLink ;-) (in der eile habe ich mich geirrt!)

mal eine frage noch .


meine ausgabe sieht so aus, wenn ich seite 2 gesucht habe!
Ob die Ausgabe schön aussieht ist mir relativ wurst , sie funktioniert und ich möchte weiter testen!


```
Suchwort   : Seite 3
Url            : ergebnissdarstellung.html
Menupunkt: Menu Ergebnissdarstellung
Index       : Seite 3
```

kann ich auf die url, ein link setzen, die mich auf die seite führt.

habe das mal nachgelesen und nur für eine html seite, die ich ausgelesen habe, den anker gesetzt(anker in html erstellt und den Listener in Java).


aber wie erstelle ich einen Link bzw. Anker, wenn ich diese url erst aus meiner xml her kenne!?


----------



## André Uhres (26. Apr 2007)

licht400 hat gesagt.:
			
		

> ..kann ich auf die url, ein link setzen, die mich auf die seite führt..


Einfach Editor/Browser starten und Url übergeben. Etwa so:

```
//String documentEditor = "C:\\Program Files\\Internet Explorer\\iexplore.exe";
        String documentEditor = "explorer";
        try {
            Runtime.getRuntime().exec("\""+documentEditor+"\" \"" +url+"\"");
        } catch (IOException ex) {ex.printStackTrace();
        }
```


----------



## licht400 (26. Apr 2007)

naja ich meinte die url, die ich ausgegeben habe , womit ich einfach im programm bleibe und nicht den ie öffne..

einfach wie ein weiter und zurück..bloß dass ich auf den link drücke und mir die seite im ein und dem selben prgrammfenster bleibt, ohne einen browser!

also das auf seite 3 ein link ist mit ergebnissdarstellung.html!


----------



## André Uhres (26. Apr 2007)

```
package test;
import java.awt.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class URL_Demo_1 extends JFrame {
    private String urlString;
    private JEditorPane editorpane;
    public URL_Demo_1() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//        urlString = "file:c:/einfuhrung.html";
        urlString = "http://www.das-tierlexikon.de/";
        URL url = null;
        InputStream input = null;
        try{
            url = new URL( urlString );
        }catch(MalformedURLException ex){
            ex.printStackTrace();
        }
        StringBuffer strb = null;
        try{
            try{
                input = url.openStream();
            }catch(UnknownHostException ex){
            }
            if( input != null ){
                int c = input.read();
                strb = new StringBuffer();
                while( c != -1 ){
                    char cc = (char)c;
                    strb.append(cc);
                    c = input.read();
                }
            }
        }catch(IOException ex){
            ex.printStackTrace();
        }
        editorpane = new JEditorPane();
        editorpane.setEditable(false);
        editorpane.setContentType("text/html");
        getContentPane().add(new JScrollPane(editorpane), BorderLayout.CENTER);        
        if( strb != null ){
            editorpane.setText(strb.toString());
        }else{
            editorpane.setText("Connection failed: " +urlString);
         }
        setExtendedState(JFrame.MAXIMIZED_BOTH);
    }
    public static void main(final String args[]) {new URL_Demo_1().setVisible(true);}
}
```


----------



## licht400 (26. Apr 2007)

k das schaue ich mir mal an!

nur mal eine verständnisfrage wieder.

habe ein ziemlich großen code und da wollte ich den etwas entschlacken, in dem ich etwas auslagere.
da habe ich ganz viele buttons und labels etc.
die habe ich button.java genannt!
in der datei auch noch package main;
und da sagt er mir, da er content panel nicht erkennt, obwohl es in main liegt ..wieso?
z.b.


```
public void suchenformular() {
        
        s = new JButton("search");
        s.setBounds(200,50,100,25);
        s.setForeground(Color.BLUE);
        s.setBackground(Color.WHITE);
        s.addActionListener(this);
        this.contentPanel.add(s);
        
        d = new JButton("delete");
        d.setBounds(300,50,100,25);
        d.setForeground(Color.ORANGE);
        d.setBackground(Color.WHITE);
        d.addActionListener(this);
        this.contentPanel.add(d);
```


----------



## André Uhres (26. Apr 2007)

licht400 hat gesagt.:
			
		

> ..und da sagt er mir, da er content panel nicht erkennt, obwohl es in main liegt ..wieso?..


Der gepostete Code genügt wohl kaum, um den Bug zu finden.


----------



## licht400 (26. Apr 2007)

sorry! liegen beide im selben verzeichniss!
main.java und button.java


und das contentPanel findet er nicht.
ist ja auch nicht in button.java deklariert, aber in main.
aber wie bekommt er das mit?
oder fehlt da noch was??


button.java

```
package main;

public class button {
    
    /** Creates a new instance of button_label */
    public button() {
    }
    
     public void suchenformular() {
        
        s = new JButton("search");
        s.setBounds(200,50,100,25);
        s.setForeground(Color.BLUE);
        s.setBackground(Color.WHITE);
        s.addActionListener(this);
        this.contentPanel.add(s);
        
        d = new JButton("delete");
        d.setBounds(300,50,100,25);
        d.setForeground(Color.ORANGE);
        d.setBackground(Color.WHITE);
        d.addActionListener(this);
        this.contentPanel.add(d);  
}
}
// geht noch viel weiter mit den buttons und labels..nur ein ausschnitt!
```


----------



## André Uhres (26. Apr 2007)

Im Konstruktor von button die Referenz auf main mitgeben ( new button(this) ), in einer Instanzvariablen (z.B. mainClass) in button abspeichern und dann darauf zugreifen (mainClass.contentPanel). contentPanel darf aber dann nicht "private" sein in main, sonst musst du auch noch einen Getter machen ( mainClass.getContentPanel() ).


----------



## licht400 (26. Apr 2007)

JButton s,d,w,b,c; so hab ich diese in main.java  deklariert!
und das new JButton steht ja in der button.java und wie soll ich dem das this da mit gebeN?
und mein contentPanel ist public.

die mainClass versteh ich gerade nicht, wo du die button speicherst!

ist das sozusagen ein neue klasse zum speichern der button?


----------



## André Uhres (26. Apr 2007)

licht400 hat gesagt.:
			
		

> JButton s,d,w,b,c; so hab ich diese in main.java  deklariert!
> und das new JButton steht ja in der button.java und wie soll ich dem das this da mit gebeN?
> und mein contentPanel ist public.
> 
> ...


In main erzeugst du button mit new button(this). "mainClass" ist eine Instanzvariable in button:

```
private main mainClass;
```
Konstruktor von button:

```
public button(main mainClass){
   this.mainClass = mainClass;
}
```


----------



## licht400 (26. Apr 2007)

und dann erkennt main.java meine button in button.java?
ohne das ich sie miteinander bekannt mache!

reicht wenn sie im gleichen ordner liegen!?


----------



## André Uhres (26. Apr 2007)

main erzeugt ja button. Mit Hilfe einer Refernz auf button kann man dann auf die JButtons von button zugreifen:

```
button bt = new button(this);//bt = Referenz auf button
s = bt.s   //--> Zugriff auf den JButton s in button
```


----------



## licht400 (26. Apr 2007)

danke und warum sagt der mir ständig  bei 

```
public button(sim simClass){
        
        }
```

""invalid method declaration "
"return type required"

komisch!


----------



## André Uhres (26. Apr 2007)

Dann steht der Konstruktor nicht in der "button" Klasse!


----------



## licht400 (27. Apr 2007)

danke.
es sieht jetz so aus

button.java 


```
package sim;

public class button {

   private sim simClass;
   
    public button(sim simClass){
         this.simClass = simClass;    
  }
    
    public void suchenformular() {
       
        
        s = new JButton("search");
        s.setBounds(200,50,100,25);
        s.setForeground(Color.BLUE);
        s.setBackground(Color.WHITE);
        s.addActionListener(this);
        this.contentPanel.add(s);
        
        d = new JButton("delete");
        d.setBounds(300,50,100,25);
        d.setForeground(Color.ORANGE);
        d.setBackground(Color.WHITE);
        d.addActionListener(this);
        this.contentPanel.add(d);
}
}
```

sim.java


```
package sim;
import sim.button;

public sim() throws DocumentException {
       
        button bt = new button(this);
        s = bt.s;
...
}
```

aber denoch, erkennt er  in button.java weder den button s, der ja in main.java definiert ist noch das contentPanel!
irgendwas mach ich doch noch falsch


----------



## André Uhres (27. Apr 2007)

André Uhres hat gesagt.:
			
		

> Im Konstruktor von button die Referenz auf main mitgeben ( new button(this) ), in einer Instanzvariablen (z.B. mainClass) in button abspeichern und dann darauf zugreifen (*mainClass.contentPanel*). contentPanel darf aber dann nicht "private" sein in main, sonst musst du auch noch einen Getter machen ( mainClass.getContentPanel() ).


also: this.contentPanel --> mainClass.contentPanel
Das Gleiche gilt dann auch für die JButtons (d.h. s=bt.s brauchst du in dem Fall nicht, da die JButtons nicht, wie ich irrtümlich angenommen hatte, nochmal in button definiert sind).


----------



## licht400 (2. Mai 2007)

tut mir leid für die späte nachricht hier,

ich versteh was du meinst..aber!

muss ich die JButtons die in der Main schon einmal definiert waren, noch einmal defineren in der neuen button.main?

eigentlich nicht oder?

wenn nicht, dann erkennt er meine Button in der button.main immer noch nicht, auch nach dem ich in 

Main.java


```
public Main() throws DocumentException {
       
        button bt = new button(this); 
....
```
gemacht habe!

oder meintest du, dass ich das nicht mehr brauche und dies  so machen soll:  this.contentPanel --> mainClass.contentPanel ?

wenn ja, wie sieht das in meiner button.java aus und in meiner Main.java?


----------



## André Uhres (2. Mai 2007)

Du brauchst die JButtons nicht nochmal in button zu definieren.
In button: bei allem, was in mainClass definiert ist, setzt du einfach "mainClass." davor.
In mainClass: da alles in "mainClass" definiert ist, brauchst du dort die "bt"-Referenz auf button nicht unbedingt,
sie stört aber auch nicht unbedingt.


----------



## licht400 (2. Mai 2007)

ah k das habe ich verstanden und ist auch logisch!

aber er erkennt mein actionlistener nicht!

also alt: s.addActionListener(this);

neu: mainClass.s.addActionListener(this);

das haut auch nicht hin, muss ich da einen neuen actionlistener in button schreiben?


----------



## licht400 (2. Mai 2007)

so, habe den achtionlistener mit im button.java implementiert!

so. jetz möchte ich in main.java suchenformular aufrufen, dass klappt aber nicht!

wollte es so machen.

in main.java

button.suchenformular();


----------



## licht400 (2. Mai 2007)

ich komme voran.

habe jetz alles.

jetz habe ich in der main.java eine publuc void actionPerformed


if (evt.getActionCommand().equals("close")){

mach was
}

er reagiert nicht, liegt wohl daran, dass der close button in der button.java ist.

wie mach ich das?

edit:

mit if (evt.getSource() == c){
mach was
}

geht auch nicht!

c ist der button close!


----------



## André Uhres (2. Mai 2007)

licht400 hat gesagt.:
			
		

> ..er reagiert nicht, liegt wohl daran, dass der close button in der button.java ist..


Wieso machste den Close-Button nicht in mainClass, wo auch die anderen Buttons sind?


----------



## licht400 (3. Mai 2007)

alle buttons sind in button, damit das ganze übersichtlicher wird, deswegen mache ich das doch!

definieren tu ich diese in Main.java mit JButton c; 

und in Button.java  veschreib ich diese..

mainClass.c = new Button("close");
mainClass.c.setBounds(......)

....

erkennen tut er das c, aber wenn ich in der Main.java die abfrage mache, nach dem c, reagiert er nicht!


----------



## André Uhres (3. Mai 2007)

Geht er denn in actionPerformed hinein, wenn du den close button betätigst (mach mal eine Konsolenausgabe)? Hast du den ActionListener an den close button auch drangehängt?


----------



## licht400 (3. Mai 2007)

so habe ich den button in button.java beschrieben.


```
simClass.c = new JButton("close");
        simClass.c.setBounds(400,50,100,25);
        simClass.c.setForeground(Color.GREEN);
        simClass.c.setBackground(Color.WHITE);
        simClass.c.addActionListener(this);
        this.simClass.contentPanel.add(simClass.c);
```

also die actionPeformed muss rein gehen, da andere aktionen klappen.

nur die nicht, weil der button nicht in main sondern in button steht!

edit: muss ich in die actionPerformed von button.java was reinschreiben, dass er die actionperformed von main.java nimmt, wenn ich auf close drücke?


----------



## André Uhres (3. Mai 2007)

licht400 hat gesagt.:
			
		

> ..muss ich in die actionPerformed von button.java was reinschreiben, dass er die actionperformed von main.java nimmt, wenn ich auf close drücke?



Wieso gibste dem close button nicht einfach den ActionListener von main.java ?

EDIT: Sorry, wenn wir öfter aneinander vorbeireden, 
aber bei der Sachlage ist das wohl unausweichlich  :wink:


----------



## licht400 (3. Mai 2007)

simClass = mainClass habs nur geändert!

das bedeutet demzufolge

simClass.c.addActionListener(this);  und damit gebe ich dem actionlistener aus meiner main, die sim heißt, die action aus meiner sim in die button.java mit, aber nix  passiert!


----------



## André Uhres (3. Mai 2007)

Ich glaube, wir reden jetzt zu oft aneinander vorbei. 

Wenn du weitere Hilfe willst, dann mach ein KSKB. 

Siehe dazu "Lies mich" hier links nebendran. 

Danke für die Mühe.


----------



## licht400 (3. Mai 2007)

tut mir leid, hab verstanden was du meinst und es klappt !

simClass.c.addActionListener(simClass);

danke


----------



## licht400 (3. Mai 2007)

ein neues Problem / eher eine Frage ob es geht!

(kann ich das hier weiter anführen?)

und zwar, lese ich mein menu ja über xml ein!
wie herr uhres mir gezeigt hat und es auch bei mir schluss endlich funktioniert.

jetz stellte ich mir die frage, wenn ich mein menu in der xml ändere, müsste ich meine actionPerformed ja ändern.

Beispiel.

Menupunkt heißt Einstellung, ändere diesen in meiner xml auf Support(egal).

da muss ich ja ins Programm und mein valueChanged ändern.

```
public void valueChanged(TreeSelectionEvent evt) {

 if (path.getLastPathComponent().toString()== "Einstellung"){
            contentSelect("/html/einstellung.html");
        }
```

aber ich möchte die valueChanged nicht immer im Programm ändern, sondern möglichst mit der xml datei ändern!

sprich man müsste die einlesen, oder kann man in der xml datei schon sagen, dass ich unter Support jetz die Action ausführe?


----------

