Fragen über Fragen - Bei Änderung XML-Datei -> Anpassung GUI

Hallo

Zunächst einmal ich bin noch ein Anfänger und habe noch nicht so viel Ahnung.

Ich bin zurzeit Prakitkant und meine aufsichts Person ist heute auf einer Fortbildung, deswegen frage ich euch 🙂

Ich soll eine Präsentation machen mit java. Die Daten dieser Präsentation soll ich aus einem XML-File auslesen, und wenn diese Verändert wurde soll sich die Präsentation auch aktuallisieren.

Ich habe nun mehrere Probleme.

1. Ich möchte in meinem thread der in den Swing eingreift einen if befehl machen der Vergleicht ob die XML-File und das was auf der Präsentation ist noch gleich ist. Wenn ja dann soll nichts passieren wenn nicht dann soll er die Datei durch den Neuen Inhalt der XML-File ersetzen.

2. Da die aktualiesirung mit dem if Befehl dauerhaft gehen soll weiß ich nicht ob ich dazu einen eigenen thread in den Swing thread schreiben soll oder ob ich das mit einer Endlosen while schleife hin bekomme.

3. Wenn ich es mit einer While schleife mein XML-file verändere und dann wieder in die Präsentation will (Sie ist im Vollbildmodus) komme ich nicht wieder in das Fenster

Edit: 4. Wie bekomme ich nur einzelne Texte aus dem XML-file? muss die ancher noch einzelnt verschieben und in moment ist es noch so das er den gesamten text ausliest.


Ich poste jetzt als erstes die stelle um die es Hauptsächlich dreht und danach Meinen Ganzen code

Anmerkung : Ich habe nicht ganz sauber Programmiert. Dh. manche Variablen groß und vieleicht ein wenig schwer nach vollziehbar


Stelle des Problems:
Java:
	public void run() {

							if(frame.getName().equals(parser.getNamen())) {
							}
							
							else {
								System.out.println("es hat sich was verändert");
								frame.setName(frame.getName());
								endLabel.setText(frame.getName());
								frame.validate();
								frame.update(frame.getGraphics());


Klasse für den Vollbildmodus:
Java:
import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;



public class Praesentation {
	
GraphicsDevice myDevice;

	
	public Praesentation() {
		
	}
	
	
	public void vollbild(Frame frame) {

		myDevice = GraphicsEnvironment
                .getLocalGraphicsEnvironment().getDefaultScreenDevice();
		
		
				
		try {
			myDevice.setFullScreenWindow(frame);
		}
		finally {
			myDevice.setFullScreenWindow(null);
		}
		
	}

Klasse für den Frame:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.File;


import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.KeyStroke;



public class Frame extends JFrame {



	
	
	private String name;

	
	public Frame() {
		
		
		setSize(Toolkit.getDefaultToolkit().getScreenSize());
		setUndecorated(true);
		
		
		Cursor c = getToolkit().createCustomCursor(
				new ImageIcon("").getImage(), new Point(0, 0), "Cursor");
		setCursor(c);
		exit(); // Methode zum Schließen der Applikation
	}

Klasse zum XML-Parsen
Java:
import java.io.File;

import javax.xml.parsers.*;
import org.w3c.dom.Document;
import org.w3c.dom.Node;



public class Parser  {

	private String namen;

	
			public Parser() throws Exception
		  {  
		    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		    DocumentBuilder builder = factory.newDocumentBuilder();
		    File file = new File("daten.xml");
			Document document = builder.parse( file );
		    Node root = document.getLastChild();	
		    String zwischenspeicher =root.getTextContent();
		    setNamen(zwischenspeicher);
			
			
				  }
		  
		  public void setNamen(String qnamen) {
			  namen = qnamen;
		  }
		  
		  public String getNamen() {
			  return namen;
		  }
		  
}

Klasse zum Überprüfen ob die XML-File verändert wurde:

Java:
public void run() {
			try {
			parser = new Parser();
			} catch (Exception e) {
				System.out.println("Probleme beim erstellen des Parsers");
			}
			
			for ( int i = 0; i>-1 ; i ++ ) {
			 try {
				pparser = new Parser();
			} catch (Exception e) {
			System.out.println("Probleme beim erstellen des zweiten Parsers");
			}
			 String NormaleNamen = parser.getNamen();
			 String NeueNamen = pparser.getNamen();
			 if(parser.getNamen().equals(pparser.getNamen()) ){
				 System.out.println("nichts ist passiert");
				 pparser = null;
				 try {
					 Thread.sleep(5000);
				 } catch (InterruptedException e) {
					 
				 }
				 
			 }
			 else {
				 NormaleNamen = NeueNamen;
				 setBesucherliste(NormaleNamen);
				 parser.setNamen(Besucherliste);
				 pparser = null;
				 try {
					Thread.sleep(10000);
				 } catch (InterruptedException e) {}
			 }
			}
			
	}


	public String getBesucherliste() {
		return Besucherliste;
	}


	public void setBesucherliste(String besucherliste) {
		Besucherliste = besucherliste;
	}
}

Klasse um alles zu Erzeugen:

Java:
import javax.swing.JLabel;
import javax.swing.SwingUtilities;


	public class Controler  {
		
		private static Parser parser;
		private static Frame frame;
		private static Praesentation p;
		private static JLabel endLabel;
		private static  Mythread a;
		
		public static void main(String[] args) throws Exception {
			parser = new Parser();
			frame = new Frame();
			p = new Praesentation();
			endLabel = new JLabel();
			a = new Mythread();
			
			frame.setName(parser.getNamen());
			frame.getContentPane().add(endLabel);
			endLabel.setText(frame.getName());
			frame.validate();
			frame.update(frame.getGraphics());
			p.vollbild(frame);
			
			Thread worker = new Thread() {
				public void run() {
				
					SwingUtilities.invokeLater(new Runnable() {
						
						
						public void run() {

							if(frame.getName().equals(parser.getNamen())) {
							}
							
							else {
								System.out.println("es hat sich was verändert");
								frame.setName(frame.getName());
								endLabel.setText(frame.getName());
								frame.validate();
								frame.update(frame.getGraphics());
							
							
						

						};
					}
					}
					
				);

			}
			
		};
		a.start();
		worker.start();
		
		

		
		}
			
					
}


Die XML-File (steht noch nicht so viel drin):
[XML]
<Besucher>
<Person>
<Vorname>Test</Vorname>
<Nachname>Test2</Nachname>
<itemimage></itemimage>
</Person>
<Person>
<Vorname></Vorname>
<Nachname></Nachname>
<itemimage></itemimage>
</Person>
<Person>
<Vorname></Vorname>
<Nachname></Nachname>
<itemimage></itemimage>
</Person>
<Person>
<Vorname></Vorname>
<Nachname></Nachname>
<itemimage></itemimage>
</Person>
<Person>
<Vorname></Vorname>
<Nachname></Nachname>
<itemimage></itemimage>
</Person>
</Besucher>
[/XML]
 
Zuletzt bearbeitet:
Doppelpost weil ich nicht editen konnte:

Also ich glaube ich habe eins der Probleme glaube ich entdeckt.
Ich bin davon ausgegangen das der Parser, in dem Thread zum verändern des swings, der ist der auch im thread ist der die daten überprüft. Dh ich bräcuhte die variable besucherliste zum vergleichen aus dem Objekt "a" nur wenn ich das mache bekomme ich eine NullPointerException
 
Kann mir wer sagen warum "a" NullPointer ist?

Java:
	public class Controler  {
		
		private static Parser parser;
		private static Frame frame;
		private static Praesentation p;
		private static JLabel endLabel;
		private static  Mythread a;
		
		public static void main(String[] args) throws Exception {
			parser = new Parser();
			frame = new Frame();
			p = new Praesentation();
			endLabel = new JLabel();
			a = new Mythread();
			
			frame.setName(parser.getNamen());
			frame.getContentPane().add(endLabel);
			endLabel.setText(frame.getName());
			frame.validate();
			frame.update(frame.getGraphics());
			p.vollbild(frame);
			
			Thread worker = new Thread() {
				public void run() {
				
					SwingUtilities.invokeLater(new Runnable() {
						
						
						public void run() {
							
							while(true){
							if(frame.getName().matches(a.getBesucherliste())) {
								System.out.println("hallo");
								try {
									Thread.sleep(5000);
								} catch (InterruptedException e) {
								}
							}
							
							else {
								System.out.println("es hat sich was verändert");
								frame.setName(a.getBesucherliste());
								endLabel.setText(frame.getName());
								frame.validate();
								frame.update(frame.getGraphics());
							
							
						
								
						};
					}
					}
					}
				);
					
			}
			
		};
		a.start();
		worker.start();
		}					
}
 
NullPointer weg.

Lösung.

Vorher
Java:
public void run() {
            try {
            parser = new Parser();
            } catch (Exception e) {
                System.out.println("Probleme beim erstellen des Parsers");
            }
            
            for ( int i = 0; i>-1 ; i ++ ) {
             try {

Nacher
Java:
public void run() {
            try {
            parser = new Parser();
            } catch (Exception e) {
                System.out.println("Probleme beim erstellen des Parsers");
            }
            setBesucherliste(parser.getNamen); // Das einfach hinzugefügt
            for ( int i = 0; i>-1 ; i ++ ) {
             try {

Jetzt Bleibt noch das Problem das wenn ich aus dem Vollbild rausgehe nicht wieder rein Switchen kann (Tab+Alt) und das ich noch wissen muss wie ich einzelne sachen aus meiner XML auslesen kann.
 
Zuletzt bearbeitet von einem Moderator:
vielleicht gibt a.getBesucherliste() null zurück?
ohne vollständige Fehlermeldungen und besser noch Log:
Java:
System.out.println("a ist: "+a)
if (a == null) {
  System.out.println("vergiss die Benutzerliste");
} else {
  System.out.println("a-Benutzerliste ist: "+a.getBenutzerListe());
}
schwer zu sagen, und ganz unnötig schwer

edit: ok
 
Ja bin ich auch grade drauf gekommen Trozdem danke 🙂

Wie gesagt bin neuling

Edit: Warum ist es Unnötig schwer wie würde ich diese Präsentation denn leichter hin bekommen?
 
Zuletzt bearbeitet:
Ich hatte ja das Problem das wenn ich eine while schleife benutze um den Teil des Swing Threads in dem das frame immer aktualisiert wird permanent laufen zulassen ich nachdem ich raus getabbed habe nicht wieder rein konnte. Die lösung des Problems war der Swing Timer (unterscheidet sich zum normalen timer).

Wer es benötigt das ist der import : javax.swing.Timer
und hier habe ich mich drüber schlau gemacht : Galileo Computing :: Java ist auch eine Insel – 19.28 Zeitliches Ausführen mit dem javax.swing.Timer
 
> Warum ist es Unnötig schwer wie würde ich diese Präsentation denn leichter hin bekommen?

erst jetzt gesehen:
ich meinte der Fehler war unnötig versteckt, man kann wie gesagt ganz eindeutig nachschauen, was mit jedem Objekt los ist,

würdest du eine komplexe Zeile wie
> if(frame.getName().matches(a.getBesucherliste())) {
auch aufspalten in
Java:
String b = a.getBesucherliste();
...

if (name.matches(b)) {
und bekämst du die Exception in der letzten Zeile, würdest du gar nicht mehr zu a vermuten, nur noch name + b kommen halbwegs in Frage,
am Exception-StackTrace, der in matches reingeht, sieht man dann auch deutlich, dass es nur der Parameter b sein kann

Spalten auseinanderdividieren, Objekte vorher mit System.out.println anschauen,
Information der Exceptions posten oder selber anschauen

es gibt einige Möglichkeiten alles herauszufinden, darauf zu verzichten macht es unnötig schwer 😉
 

Zurück
Oben