ich habe 2 .java dateien welche jeweils die .java Datei Filechooser aufrufen.
Die 2 sind einfach 2 Klassen in welchen ich ein sql statement eine jtable füllt und bei rechtsklick wird ein export nach csv gestatet. Der Filechooser soll jetzt einfach den pfad und den dateinamen bereitstellen und den export mit den eingegebenen werten starten.
in der 1. Klasse setzte ich einen String
Java:
publicstaticString objekt ="Anschluss";
in der 2. Klasse einen String:
Java:
publicstaticString objekt ="Kasten";
In der FilechooserKlasse wollte ich so etwas machen:
Java:
classSaveLimplementsActionListener{publicvoidactionPerformed(ActionEvent e){if(verzeichnisGewaehlt ==1)try{String[] args =null;if(objekt ==""){System.out.println(objekt);}elseif(objekt =="Anschluss"){System.out.println(objekt);Anschluss.generateCsvFileget();}elseif(objekt =="Kasten"){System.out.println(objekt);Kasten.generateCsvFileget();}}catch(Exception ex){Logger.getLogger(SaveDialog.class.getName()).log(Level.SEVERE,null, ex);}elseJOptionPane.showMessageDialog(rootPane,"Kein Dateiname und kein Verzeichnis ausgewählt!!","Achtung",JOptionPane.WARNING_MESSAGE);}
die Variable objekt wird aber nicht übergeben wenn ich die FilechooserKlasse aufrufe und so bekomme ich immer null als ergebnis
Eventuell noch etwas zu "hoch". Aber für den Fall wäre es geschickter ein Interface mit der Methode
Code:
generateCsvFileget()
zu definieren. Beide Klassen implementieren dieses Interface. Dann muss man beim Speichern einfach nur das Objekt einer der Klassen übergeben und daran die Methode aufrufen - eine Fallunterscheidung wird damit überflüssig.
privateString userName;publicStringgetUserName(){return userName;}publicvoidsetUserName(String userName){this.userName = userName;}publicstaticvoidmain(String[] argv){..Kasten a =newKasten();
a.setUserName("Kasten");SaveDialog b =newSaveDialog(a);}
Und in der Klasse in der der FileChooser gestartet wird (SaveDialog):
Java:
privateKabelkasten a;publicSaveDialog(Kabelkasten a){this.a = a;System.err.println(a.getUserName());}// als Testausgabe...classSaveLimplementsActionListener{publicvoidactionPerformed(ActionEvent e){//System.out.println(a.);if(verzeichnisGewaehlt ==1)try{if(a.getUserName()=="Kasten"){Objekte.Kasten.generateCsvFileget();}elseif(a.getUserName()=="Anschluss"){System.out.println(a.getUserName());Objekte.Anschluss.generateCsvFileget();}}catch(Exception ex){Logger.getLogger(SaveDialog.class.getName()).log(Level.SEVERE,null, ex);}elseJOptionPane.showMessageDialog(rootPane,"Kein Dateiname und kein Verzeichnis ausgewählt!!","Achtung",JOptionPane.WARNING_MESSAGE);}
Wenn ich es starte kommt :
java.lang.NullPointerException
at Objekte.SaveDialog$SaveL.actionPerformed(SaveDialog.java:100)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703)
at java.awt.EventQueue.access$000(EventQueue.java:102)
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:676)
at java.awt.EventQueue$4.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:673)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
Ich nehme Mal an, dass da oben beim Code ins Forum kopieren etwas schief gegangen ist.
Aber grundsätzlich ist nirgends zusehen wie die Referenz von a (hier wäre ein sinnvoller Name angebracht) aus SaveDialog an die Variable a in der Klasse SaveL weitergegeben wird.
Warum gibst Du die Info über den Errorstream aus? Die Ausgabe erfolgt in SaveDialog hier wird die Referenz ja im Konstruktor über geben. Wird denn in der actionPerformed auch was ausgegeben und wenn ja was?
Um mal auf meinen Vorschlag "sich die Abfrage zu sparen und mit einem Interface zu arbeiten"zurück zukommen:
Java:
publicclassTestKlasse{publicstaticvoidmain(String[] s){Kasten kasten =newKasten();Anschluss anschluss =newAnschluss();SaveDialog.showSaveDialog(kasten);SaveDialog.showSaveDialog(anschluss);}}interfaceCsvFileGenerator{publicvoidgenerateCsvFile();}classKastenimplementsCsvFileGenerator{publicvoidgenerateCsvFile(){// zu implementierenSystem.out.println(getClass().getSimpleName());}}classAnschlussimplementsCsvFileGenerator{publicvoidgenerateCsvFile(){// zu implementierenSystem.out.println(getClass().getSimpleName());}}classSaveDialog{publicstaticvoidshowSaveDialog(CsvFileGenerator generator){// zu implementieren
generator.generateCsvFile();}}
Der statische Methodenzugriff in der SaveDialog muss nicht sein.
so, hab es (vermutlich umständlicher als notwendig) hinbekommen...
meine SaveDialog Klasse hat noch eine 2. Klasse in der der Wert natürlich nicht bekannt war.
Ich habe jetzt noch eine Variable String definiert die ich am Anfang dem a.getUserName() zuweise.
Jetzt funktioniert es