# Auslagern einer Funktion



## AndreG (9. Februar 2004)

Hallo alle miteinander 

Ich bin ein relativer neueinsteiger in java und habe mich dann doch auch mal selbst dran gemacht nen eigenes Prog zu schreiben. Das Haupteil funktioniert schon wunderbar nur gelingt es mir leider nicht ein teil des prgramms in eine extra datei auszulagern. Diese Hauptklassel soll nur das fenster produzieren und wenn ich auf den button copy drücke soll die 2te klasse (die ganz unten steht) ein file kopieren. Ich würde nur gerne wissen wie ich die klasse von dem hauptprog ansprechen kann (das untere prog wird noch die pfade aus einer txt auslesen später sollen einfach erstmal zumtest fest sein). Hoffe auf eure Hilfe und danke im voraus 

p.s hoffe die überschrift pass zu dem prob 


```
import java.awt.*;
import java.awt.event.*;
import java.awt.color.*;
import java.awt.Font.*;

class Fenster extends Frame{
	   
    Label l1,l2,l3;
    TextField t1,t2,t3;
    Button b1,b2;
    
    Fenster(String Titel) {
        
        super(Titel);
        //------------------------ActionListener---------------------------------------
        
        class ende_Listener implements ActionListener{
            
            public void actionPerformed(ActionEvent e){
                
                System.exit(0);
                
            }
            
        }
        
        class b2_Listener implements ActionListener{
            
            public void actionPerformed(ActionEvent e){
                
                String i = (t1.getText());
                
                String j = (t2.getText());             
                
                //System.out.print(""+i);System.out.print(""+j);             
            }
            
        }     
        
        
        class b1_Listener implements ActionListener{
            
            public void actionPerformed(ActionEvent e){
            	
        }
    }
            
              
        
        //------------------------Menue------------------------------------------------
        
        MenuBar mbar = new MenuBar();
        
        Menu datei = new Menu("Datei");
        Menu Über = new Menu("?");
        
        MenuItem ende = new MenuItem("Beenden");
        MenuItem hilfe = new MenuItem("Info");
        
        
        datei.add(ende);
        Über.add(hilfe);
        
        mbar.add(datei);
        mbar.add(Über);
        
        setMenuBar(mbar);
        
        ende.addActionListener(new ende_Listener());
        //hilfe.addActionListener(new hilfe_Listener());
        
        
        //------------------------Panels-----------------------------------------------      
        
        Panel links = new Panel();
        links.setLayout(new GridLayout(0,1));
        links.setFont( new Font( "Serif", Font.BOLD, 15 ) );
        l1 = new Label("Quelle:");
        l1.setForeground(Color.red);
        l2 = new Label("   Ziel:");
        l2.setForeground(Color.red);
        l3 = new Label(" Name:");
        l3.setForeground(Color.red);
        links.add(l1);
        links.add(l2);
        links.add(l3);
        
        Panel mitte = new Panel();
        mitte.setLayout(new GridLayout(0,1));
        t1 = new TextField("");
        t2 = new TextField("");
        t3 = new TextField("");
        mitte.add(t1);
        mitte.add(t2);
        mitte.add(t3);
        
        Panel rechts = new Panel();
        rechts.setFont( new Font( "Serif", Font.BOLD, 15 ) );
        b2 = new Button("Save");
        b2.addActionListener(new b2_Listener());
        rechts.add(b2);
        
        Panel unten = new Panel();
        unten.setFont( new Font( "Serif", Font.BOLD, 15 ) );
        b1 = new Button("Copy");
        b1.addActionListener(new b1_Listener());
        unten.add(b1);
        
        //------------------------Layout-----------------------------------------------
        
        setLayout(new BorderLayout());
        add("West",links);
        add("Center",mitte);
        add("East",rechts);
        add("South",unten);
        
        //------------------------WindowCloser-----------------------------------------
        
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }});
            
    } 
    
    //------------------------Main-------------------------------------------------
    
    public static void main(String args[]){
    	
    	        
        Fenster f1 = new Fenster("Demobackup");
        
        f1.setBackground(Color.blue);
        
        f1.setSize(300,130);
        
        f1.show();
        
    }
}
```

Und hier die Klasse zum kopieren:


```
import java.io.*;

public class KopiereDatei {
    public static void main (String [] args) throws Exception {
        RandomAccessFile datei = new RandomAccessFile("d:\\hallo.txt","r");
        RandomAccessFile neudatei = new RandomAccessFile("c:\\hallo.txt", "rw");
        while (neudatei.length() < datei.length()) {
            neudatei.write(datei.read());
        }
        datei.close();
        neudatei.close();
    }
}
```


----------



## oska (9. Februar 2004)

Hi, ich hoffe ich hab richtig verstanden was du willst.

Also erstmal darf eine Applikation, soviel ich weiß, nur eine public static void main() haben.

Mit dem Auslagern meinst du hoffentlich nicht JavaBeans o.ä., sondern nur in ein eigenes class file.
Das mach ich so:

import java.io.*;

public class KopiereDatei {

    public void kopiere(String url) throws Exception {
        RandomAccessFile datei = new RandomAccessFile("d:\\hallo.txt","r");
        RandomAccessFile neudatei = new RandomAccessFile("c:\\hallo.txt", "rw");
        while (neudatei.length() < datei.length()) {
            neudatei.write(datei.read());
        }
        datei.close();
        neudatei.close();
    }
}

Von dieser Klasse jetzt ein neues Objekt in deiner Hauptklasse erzeugen:

KopiereDatei kd = new KopiereDatei();

Jetzt kannst du die Methode kopiere() so ausführen:

kd.kopiere(url);

Diese Zeilen wirst du wahrscheinlich in die actionPerformed() packen.

Hoffe ich konnte ausnahmsweise mal helfen.


----------



## AndreG (9. Februar 2004)

Du hast mich schon richtig verstanden  habs etwas falsch ausgedrückt  werds nachher mal testen obs geht und thx schonmal für die schnelle antwort. und in der einen stand noch main weil ich sie aus der urfassung kopiert hatte.

edit also ich hab das mal eingefügt aber irgendwie will das nich ich poste gleich mal wie das prog nu aussieht.


----------



## AndreG (9. Februar 2004)

Und warum hast du den String Url eingebaut? wofür brauch ich den? weil dadurch ensteht der fehler. Das ist jetzt das hauptprog:


```
import java.awt.*;
import java.awt.event.*;
import java.awt.color.*;
import java.awt.Font.*;

class Fenster extends Frame{
	
	KopiereDatei kd;  
    Label l1,l2,l3;
    TextField t1,t2,t3;
    Button b1,b2;
    
    Fenster(String Titel) {
        
        super(Titel);
        //------------------------ActionListener---------------------------------------
        
        class ende_Listener implements ActionListener{
            
            public void actionPerformed(ActionEvent e){
                
                System.exit(0);
                
            }
            
        }
        
        class b2_Listener implements ActionListener{
            
            public void actionPerformed(ActionEvent e){
                
                String i = (t1.getText());
                
                String j = (t2.getText());             
                
   				//hier kommt das speichern in eine datei hin.             
            }
            
        }     
        
        
        class b1_Listener implements ActionListener{
            
            public void actionPerformed(ActionEvent e){
            	
            	kd.kopiere(url);
        }
    }
            
              
        
        //------------------------Menue------------------------------------------------
        
        MenuBar mbar = new MenuBar();
        
        Menu datei = new Menu("Datei");
        Menu Über = new Menu("?");
        
        MenuItem ende = new MenuItem("Beenden");
        MenuItem hilfe = new MenuItem("Info");
        
        
        datei.add(ende);
        Über.add(hilfe);
        
        mbar.add(datei);
        mbar.add(Über);
        
        setMenuBar(mbar);
        
        ende.addActionListener(new ende_Listener());
        //hilfe.addActionListener(new hilfe_Listener());
        
        
        //------------------------Panels-----------------------------------------------      
        
        Panel links = new Panel();
        links.setLayout(new GridLayout(0,1));
        links.setFont( new Font( "Serif", Font.BOLD, 15 ) );
        l1 = new Label("Quelle:");
        l1.setForeground(Color.red);
        l2 = new Label("   Ziel:");
        l2.setForeground(Color.red);
        l3 = new Label(" Name:");
        l3.setForeground(Color.red);
        links.add(l1);
        links.add(l2);
        links.add(l3);
        
        Panel mitte = new Panel();
        mitte.setLayout(new GridLayout(0,1));
        t1 = new TextField("");
        t2 = new TextField("");
        t3 = new TextField("");
        mitte.add(t1);
        mitte.add(t2);
        mitte.add(t3);
        
        Panel rechts = new Panel();
        rechts.setFont( new Font( "Serif", Font.BOLD, 15 ) );
        b2 = new Button("Save");
        b2.addActionListener(new b2_Listener());
        rechts.add(b2);
        
        Panel unten = new Panel();
        unten.setFont( new Font( "Serif", Font.BOLD, 15 ) );
        b1 = new Button("Copy");
        b1.addActionListener(new b1_Listener());
        unten.add(b1);
        
        //------------------------Layout-----------------------------------------------
        
        setLayout(new BorderLayout());
        add("West",links);
        add("Center",mitte);
        add("East",rechts);
        add("South",unten);
        
        //------------------------WindowCloser-----------------------------------------
        
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }});
            
    } 
    
    //------------------------Main-------------------------------------------------
    
    public static void main(String args[]){
    	
    	KopiereDatei kd = new KopiereDatei();
    	   	    	       
        Fenster f1 = new Fenster("Demobackup");
        
        f1.setBackground(Color.blue);
        
        f1.setSize(300,130);
        
        f1.show();
        
        
    }
}
```

 und das die Fehlermeldung :

C:\Dokumente und Einstellungen\Andre\Desktop\Giga\DemoBackup\Fenster.java:46: cannot resolve symbol
symbol  : variable url  
location: class b1_Listener
            	kd.kopiere(url);
                           ^


----------



## zauberertz (10. Februar 2004)

> ```
> class b1_Listener implements ActionListener{
> 
> public void actionPerformed(ActionEvent e){
> ...



Weil du das Beispiel einfach übernommen hast, und nicht an deine Wünsche angepasst hast! Versuchs mal damit:


```
import java.io.*;  
public class KopiereDatei {
   public kopiere (String quelle,String ziel) throws Exception {          
      RandomAccessFile datei = new RandomAccessFile(quelle,"r");
      RandomAccessFile neudatei = new RandomAccessFile(ziel, "rw"); 
      while (neudatei.length() < datei.length()) {             
          neudatei.write(datei.read());         
       }          
      datei.close();         
      neudatei.close();      
   }
}
```

und den aufruf dann mit:


```
KopiereDatei kd = new KopiereDatei();

kd.kopiere("d:\\hallo.txt","c:\\hallo.txt);
```

So sollte das gehen!

Mfg Thomas


----------



## oska (10. Februar 2004)

Stimmt hatte ich nicht weiter angepasst. Sorry. Aber es gibt ja noch andere Foris, die helfen.


----------



## AndreG (10. Februar 2004)

Jetzt im nachhienein seh ich es auch   war etwas konfus. Ich habe die Actionlistener jetzt so 

```
class b1_Listener implements ActionListener{
            
            public void actionPerformed(ActionEvent e){

                quelle = (t1.getText());
                
                ziel = (t2.getText());             
                
                KopiereDatei kd = new KopiereDatei();
                
                kd.kopiere(quelle, ziel);
                
            }
            
        }
```
abgeändert und String quelle und ziel global deklariert. nur sagt er mir jetzt in der klasse KopiereDatei wenn ich sie compalieren will 

"invalid method declaration; return type required   public kopiere (String quelle,String ziel) throws Exception

Die Datei kopiere sind bei mir jetzt so aus.

```
import java.io.*;
public class KopiereDatei {
   public kopiere(quelle, ziel) throws Exception {          
      RandomAccessFile datei = new RandomAccessFile(quelle,"r");
      RandomAccessFile neudatei = new RandomAccessFile(ziel, "rw"); 
      while (neudatei.length() < datei.length()) {             
          neudatei.write(datei.read());         
       }          
      datei.close();         
      neudatei.close();
      
   }
}
```


----------



## oska (10. Februar 2004)

Ja, Ja da hast du keinen Return-Type für die Methode angegeben.


```
import java.io.*;
public class KopiereDatei {
   public void kopiere(quelle, ziel) throws Exception {          
      RandomAccessFile datei = new RandomAccessFile(quelle,"r");
      RandomAccessFile neudatei = new RandomAccessFile(ziel, "rw"); 
      while (neudatei.length() < datei.length()) {             
          neudatei.write(datei.read());         
       }          
      datei.close();         
      neudatei.close();
      
   }
}
```

Mit "void" gibst du an, dass kein Wert zurückgegeben wird.


----------



## AndreG (10. Februar 2004)

Jo das mit void ist mir bekannt nur sieht das jetzt folgendermassen alles aus


```
import java.awt.*;

import java.awt.event.*;

import java.awt.color.*;

import java.awt.Font.*;




class Fenster extends Frame{
    
    String quelle;
    String ziel;
    Label l1,l2,l3;
    TextField t1,t2,t3;
    Button b1,b2;
    
    Fenster(String Titel) {
        
        super(Titel);
        //------------------------ActionListener---------------------------------------
        
        class ende_Listener implements ActionListener{
            
            public void actionPerformed(ActionEvent e){
                
                System.exit(0);
                
            }
            
        }
        
        class b2_Listener implements ActionListener{
            
            public void actionPerformed(ActionEvent e){
                
                //quelle = (t1.getText());
                
                //ziel = (t2.getText());             
                
                //System.out.print(""+i);System.out.print(""+j);
                
                
            }
            
        }     
        
        
        class b1_Listener implements ActionListener{
            
            public void actionPerformed(ActionEvent e){
            	
            	quelle = (t1.getText());
                
                ziel = (t2.getText());
                
                KopiereDatei kp = new KopiereDatei();
                
                kp.kopiere(quelle, ziel);
                
            }
            
        }   
        
        
        //------------------------Menue------------------------------------------------
        
        MenuBar mbar = new MenuBar();
        
        Menu datei = new Menu("Datei");
        Menu Über = new Menu("?");
        
        MenuItem ende = new MenuItem("Beenden");
        MenuItem hilfe = new MenuItem("Info");
        
        
        datei.add(ende);
        Über.add(hilfe);
        
        mbar.add(datei);
        mbar.add(Über);
        
        setMenuBar(mbar);
        
        ende.addActionListener(new ende_Listener());
        //hilfe.addActionListener(new hilfe_Listener());
        
        
        //------------------------Panels-----------------------------------------------
        
        
        
        Panel links = new Panel();
        links.setLayout(new GridLayout(0,1));
        links.setFont( new Font( "Serif", Font.BOLD, 15 ) );
        l1 = new Label("Quelle:");
        l1.setForeground(Color.red);
        l2 = new Label("   Ziel:");
        l2.setForeground(Color.red);
        l3 = new Label(" Name:");
        l3.setForeground(Color.red);
        links.add(l1);
        links.add(l2);
        links.add(l3);
        
        Panel mitte = new Panel();
        mitte.setLayout(new GridLayout(0,1));
        t1 = new TextField("");
        t2 = new TextField("");
        t3 = new TextField("");
        mitte.add(t1);
        mitte.add(t2);
        mitte.add(t3);
        
        Panel rechts = new Panel();
        rechts.setFont( new Font( "Serif", Font.BOLD, 15 ) );
        b2 = new Button("Save");
        b2.addActionListener(new b2_Listener());
        rechts.add(b2);
        
        Panel unten = new Panel();
        unten.setFont( new Font( "Serif", Font.BOLD, 15 ) );
        b1 = new Button("Copy");
        b1.addActionListener(new b1_Listener());
        unten.add(b1);
        
        //------------------------Layout-----------------------------------------------
        
        setLayout(new BorderLayout());
        add("West",links);
        add("Center",mitte);
        add("East",rechts);
        add("South",unten);
        
        //------------------------WindowCloser-----------------------------------------
        
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }});
            
    }
    //------------------------Methoden---------------------------------------------
    
    
    
    //------------------------Main-------------------------------------------------
    
    public static void main(String args[]){
            
               
        Fenster f1 = new Fenster("Demobackup");
        
        f1.setBackground(Color.blue);
        
        f1.setSize(300,130);
        
        f1.show();
        
    }
}
```
 und die classe so

```
import java.io.*;
public class KopiereDatei {
   public void kopiere(String quelle, String ziel) throws Exception {          
      RandomAccessFile datei = new RandomAccessFile(quelle,"r");
      RandomAccessFile neudatei = new RandomAccessFile(ziel, "rw"); 
      while (neudatei.length() < datei.length()) {             
          neudatei.write(datei.read());         
       }          
      datei.close();         
      neudatei.close();
      
   }
}
```

und dieser fehler erscheint nun bei compalieren der Fenster.java

C:\Dokumente und Einstellungen\Andre\Desktop\Giga\DemoBackup\Fenster.java:61: unreported exception java.lang.Exception; must be caught or declared to be thrown
                kp.kopiere(quelle, ziel);
                  ^
was kann das jetzt den schon wieder sein? deklariert ist die klasse kopiere doch


----------



## oska (11. Februar 2004)

Das zieht sich ja wie Kaugummi 

Probiers mal so:


```
class b1_Listener implements ActionListener{
            
            public void actionPerformed(ActionEvent e){
            	
            	quelle = (t1.getText());
                
                ziel = (t2.getText());
                
               Try{
                              KopiereDatei kp = new KopiereDatei();
                              kp.kopiere(quelle, ziel);
                     }
                     catch(Exception e){
                              System.out.println("Fehler: " + e.toString());
                    }
            }
        }
```

Kanns grade leider nicht ausprobieren.


----------



## AndreG (11. Februar 2004)

ja da haben die catch befehle gefehlt für das throw  habs schon selbst geschaft  *freu* und prog rennt auch gut nur leider ist es bei großen datein sehr langsam. aber thx für eure hilfe.

Aso und das try muss nach das new also erst wo man den konstruktor auffruft


----------



## AndreG (13. Februar 2004)

So das programme geht vernünftig nur leider ist es wenn ich mit  InstallAnywhere daraus eine exe erzeuge also mit VM dann ist das teil 10MB groß ohne nur 1MB das prob ist nur das nich jeder VM installiert hat. Ich habe dann von einer möglichkeit gehört die java mainclass mit c++ zu starten aber wie geht sowas?


----------

