Variablen setzen und in einer anderen Klasse nutzen.

Polli

Mitglied
Hallöchen,

bin mal wieder hier und hab da mal wieder eine Frage...

Ich mal ein programm geschrieben was aus einer XML-Datei Daten ausliest. Habe dadurch logischerweise den Pfad der XML-Datei angegeben und zwar mit der Variable "filename".
Danach habe ich die Datei in einer anderen Klasse bearbeitet und nun sollte ich eine GUI-Oberfläche dafür zaubern (wo bei mir auch zT von euch schon geholfen wurde :D ).

Mein Frage lautet nun:

Wie kann ich die Datei über den Pfad den ich durch den JFileChooser rausgesucht habe, in die Klasse implementieren, wo ich den Pfad nutzen muss, damit alle Klassen funktionieren?

OMG hab ich kompliziert geschrieben :D:D:D


kurzes Bsp. wie weit ich bin:

Code:
	ActionListener openA = new ActionListener()
	{
		public void actionPerformed(ActionEvent e)
		{
		    JFileChooser fc = new JFileChooser(); 
		    fc.setFileFilter( new FileFilter() 
		    { 
		      @Override public boolean accept( File f ) 
		      { 
		        return f.isDirectory() || 
		          f.getName().toLowerCase().endsWith( ".xml");
		      } 
		      @Override public String getDescription() 
		      { 
		        return "XML (*.xml)"; 
		      } 
		    } ); 
		 
		    int state = fc.showOpenDialog( null ); 
			    if ( state == JFileChooser.APPROVE_OPTION ) 
			    { 
			      File file = fc.getSelectedFile(); 
			      System.out.println(file.getAbsolutePath());
			      A.setText(file.getAbsolutePath());
			      String a = file.getAbsolutePath();
			      try
			      {
			    	  Desktop.getDesktop().open( new File(a) );
			      }
			      catch(IOException f)
			      {
			    	  
			      }
			      System.out.println(a);
			      DA.setFilename(a);
			      System.out.print(DA.getFilename());
			      A.setText(a);
			      DA.filename = a;
			    } 
		}
	};

Somit habe ich auf "DA.setFilename(a);" den Pfad und den mag ich nun in meine andere Klasse einfügen, so weit komme ich aber nicht weil mir nach dem auslesen immer eine "NullPointException" angeziegt wird und eine ewig lange Fehlermeldung...



Kann mir jemand dabei helfen?
 
1. Fehlermeldung Posten
2. Um Zugriff von einem Objekt auf Variablen eines anderen verwendet man getter Methoden (getXXX()).
 
Hier ist die Fehlermeldung:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Layout1$4.actionPerformed(Layout1.java:93)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
 
Hab mal ein kurzes Beispiel gemacht, wie es in etwa aussieht:

Code:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;


public class ButText 
{
	testen t = new testen();
	public String ap; 
	
    JFrame f = new JFrame(); 
    Container c = f.getContentPane(); 
    static GridBagLayout gbl = new GridBagLayout(); 

	ActionListener open = new ActionListener()
	{
		public void actionPerformed(ActionEvent e)
		{
		    JFileChooser fc = new JFileChooser(); 
		    fc.setFileFilter( new FileFilter() 
		    { 
		      @Override public boolean accept( File f ) 
		      { 
		        return f.isDirectory() || 
		          f.getName().toLowerCase().endsWith( ".txt");
		      } 
		      @Override public String getDescription() 
		      { 
		        return "Text (*.txt)"; 
		      } 
		    } ); 
		 
		    int state = fc.showOpenDialog( null ); 
		 
		    if ( state == JFileChooser.APPROVE_OPTION ) 
		    { 
		      File file = fc.getSelectedFile(); 
		      file.getAbsolutePath();
		      System.out.println(file.getAbsolutePath());
		      A.setText(file.getAbsolutePath());
		      String p = file.getAbsolutePath();
		      ap = file.getAbsolutePath();
		      t.setFilename(ap);
		      System.out.print(t.getFilename());
		    } 
		}
	};

	//ÜBERSCHRIFT
	JLabel Ueschrift = new JLabel("<html><FONT SIZE = 6><u>Überschrift</u></font></html>");
	
	//TextFeld
	JTextField A  = new JTextField();
	
	//IMAGE
    final Icon smallIcon = new ImageIcon( JMenu.class.getResource("/images/magnifier.png") );
   
    //Button
	JButton LupeA 	 = new JButton(smallIcon)  	;

	public void ButtonPress()
	{
		LupeA.addActionListener(open)  ;
	}
	
	public void init()
	{
	    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
	    c.setLayout( gbl ); 
		f.pack();
		f.setVisible(true);
		f.setLocation(128, 128);
		f.setSize( 350, 150 );
		f.setVisible( true );
	}
	
	static void addComponent( Container cont, 
			GridBagLayout gbl, 
			Component c, 
			int x, int y, 
			int width, int height, 
			int ipadx, int ipady,
			double weightx,
			Insets insets
			) 
	{ 
		GridBagConstraints gbc = new GridBagConstraints(); 
		gbc.fill = GridBagConstraints.VERTICAL; 
		gbc.insets = insets;
		gbc.gridx = x; gbc.gridy = y; 
		gbc.gridwidth = width; gbc.gridheight = height; 
		gbc.ipadx = ipadx; gbc.ipady = ipady;
		gbl.setConstraints( c, gbc ); 
		gbc.anchor = GridBagConstraints.WEST;
		cont.add( c ); 
	} 

    public void GridBLayout()
    {
		addComponent( c, gbl, Ueschrift,   0,  0, 16, 1,   0,  0, 1.0, new Insets( 0, 0,20, 0));
		
		addComponent( c, gbl, A,  	       11, 3,  4, 1, 250, 0, 0.1, new Insets( 0, 0, 0, 0));
		addComponent( c, gbl, LupeA, 	   15, 3,  1, 1,   0, 0, 0.0, new Insets( 0, 0, 0, 10));
    }
    
    public void run()
    {
		init();
		GridBLayout();
		ButtonPress();
	}
	  public static void main( String[] args ) 
	  { 
		  ButText L = new ButText();
		  L.run();
	  }

	public String getAp() {return ap;}
	public void setAp(String ap) {this.ap = ap;}

}

und die andere Klasse wo die Variable "filename" genutzt werden soll:

Code:
public class testen 
{
	private String filename;

	public String getFilename() {return filename;}

	public void setFilename(String filename) {this.filename = filename;}
	
	public void te()
	{
		ButText bt = new ButText();
		bt.run();
		filename = bt.getAp();
		System.out.println("Das ist der Text: "+this.getFilename());
	}
	
	
	public static void main(String[] args) 
	{

		
		testen t = new testen();
		t.te();
	}
}

Büdde :D:D:D:D
 
Also wenn man eine GUI zu einem bestehen Programm baut, dann ruft normalerweise die GUI die Methoden der bereits bestehenden Klassen auf.

Also: Wenn du auf den Button klickst geht dein FileChooser auf. Sobald du den Dateinamen vom FileChooser bekommen hast, übergibst du diesen an deine Methode die die XML-Datei ausliest. Und nicht andersrum wie es deine testen-Klasse vermuten lässt (und Klassennamen bitte immer groß schreiben, Methodennamen klein und benutz am besten nicht run als Methodennamen. Das lässt immer auf einen Implementierung von Runnable.run schließen und das ist hier eher unglücklich).

Noch eine Anmerkung: Sei bitte ein wenig geduldig. Viele haben erst nach der Arbeit Zeit hier reinzuschauen aber geantwortet wird dir eigentlich auf jeden Fall. Nur wenn man nervt kannst anders aussehen ;)
 
Danke für die Antwort, habe die Lösung nun aber schon.

Sorry dass ich genervt habe, aber ich musste das heute fertig stellen...
 
So wie du es dann auch gesagt hast ;)
Weiß auch nicht was vorhin war, war irgendwie der Wurm drin^^

Hab dann den Wert über public variablen, von einer Klasse in die nächste und dann in die eigentliche (da wo sie benötigt wird), dort wurde dann auch endlich der richtige Pfad im Debugger angezeigt und mit dem Rest muss ich mich nochmal genauer beschäftigen ;)


Danke nochmal und ein schönes Wochenende @ everybody ;)
 
Zurück