Objekt in "actionPerformed" erzeugen und nutzen

Bluedolphin

Grünschnabel
Hallo, ich habe eine doppelt verkettete Liste implementiert und möchte diese nun mit einem einfachen Gui testen, d.h. mit einem Klick auf den Button "Create" eine Liste erzeugen, mit "Insert" Elemente über eine Textfeld einfügen, etc.

Mein Problem ist nun, dass ich das Objekt ja erst bei dem Klick auf "Create" erzeuge, in anderen if-Abfragen in der actionPerfomed-Methode aber mit dem Objekt ("test") arbeite, indem ich z.B. die insert()-Methode etc aufrufe.
Wie kann ich das Problem lösen, wenn ich das Objekt per Button erzeugen möchte und nicht vorher Hab schon versucht die if-Abfragen für die Buttons zu schachteln, aber das funktioniert auch nicht.

Mein Code:

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Student { 

   public class Student_Node {
   	
    String name; 
    int matr_nr; 
      
    Student_Node prev; // vorheriges Element 
    Student_Node next; // naechstes Element
       
    Student_Node(String name, int matrikelnummer) {
    	
    	 this.name = name; 
    	 this.matr_nr = matrikelnummer; 
      
    }
    } 
    
   Student_Node first;
   Student_Node last;
    
    
   // neues Element (Knoten) in die Liste einfuegen ----------------------------
   
   void insert(String name, int matr_nr) {
   	 
   	 // Erzeugen eines neuen Knotens 
   	 Student_Node studi = new Student_Node(name,matr_nr);
   	 
   	 // falls Liste leer
   	 if (first == null) {
   	 	
   	 	studi.prev = studi;
   	 	studi.next = null;
   	 	first = studi;
   	 }
   	 
   	 else {
   	 
   	 studi.next = first;
   	 
   	 if (first != null) {
   	 		
    	first.prev = studi;
   	 	
   	 	}
   	 	
   	 first = studi;
     studi.prev = last;
   	 
   	 }
   }
   
   
   // Element aus Liste loeschen -----------------------------------------------
   
   void delete(int matr_nr) {
   	
    Student_Node temp = first; 
     
     while (temp != null) {
         
         if (temp.matr_nr == matr_nr) { 
              	
               //wenn temp nicht erstes Element	
			   if (temp.prev != null) {
   		
   					(temp.prev).next = temp.next;
   					
   			   }
   			   else {
   					
   					//wenn temp erstes Element
   					first = temp.next;
   			   }
   				
   			   //wenn temp nicht letztes Element		
   			   if (temp.next != null) {
   		
   					(temp.next).prev = temp.prev;
   			   } 
         } 
         
         temp = temp.next; 
     }  	
   }
   
   
   // Studenten nach Matrikelnummer suchen -------------------------------------
   
   void search(int matr_nr) {
   	
   	Student_Node temp = first;
   	boolean found = false;
   	
   	// gesuchtes Element = erstes Element ? ...
   	if (temp.matr_nr == matr_nr) {
   		
  		found = true;
   	}
   	// ...falls nicht laufe durch Liste
 	while (temp.next != null && temp.matr_nr != matr_nr) {

   		
   		if (temp.next != null) {
   		
            temp = temp.next;      
   		}
   		
   		if (temp.matr_nr == matr_nr) {
   			
   			found = true;
   		}

    }
    
    if (found == true) {
    	
    	System.out.println("Folgender Student wurde gefunden: " + temp.name);
 	}
    else {
    	
    	System.out.println("Die Liste enthaelt keinen Studenten mit der Matrikelnummer " + matr_nr); 
    }
   }
  
  
   // Ausgabe der gesamten Liste (iterativ) ------------------------------------
   
   void print_iterativ() {	 
  		
  	while(temp != null) {
  		
  	    System.out.println(temp.matr_nr/* + " - " +temp.name*/);
  		temp = temp.next;
  	 }
   }
   
}

class Gui extends JFrame implements ActionListener { 
    
   JPanel panel1; 
   JPanel panel2; 
   JPanel panel3;
   JPanel panel4; 
   JButton create; 
   JTextField create_txt; 
   JButton insert_front;
   JTextField insert_front_matr;
   JTextField insert_front_name;
   JButton delete;
   JTextField delete_txt;
   JButton show;
    
   public Gui() { 
      
      super("Doppelt verkettete Liste");
       
      panel1 = new JPanel(); 
      panel2 = new JPanel(); 
      panel3 = new JPanel();
      panel4 = new JPanel(); 
       
      create = new JButton("Create");
      create.addActionListener(this);
      insert_front = new JButton("Insert (front)");
      insert_front.addActionListener(this);
      delete = new JButton("Delete");
      delete.addActionListener(this);
      show = new JButton("Show");
      show.addActionListener(this);
	   
       
      create_txt = new JTextField(5); 
      insert_front_matr = new JTextField(5);
      insert_front_name = new JTextField(20);
      delete_txt = new JTextField(5);  
       
      panel1.add(create_txt);
      panel1.add(create);
       
      panel2.add(insert_front_matr);
      panel2.add(insert_front_name); 
      panel2.add(insert_front); 
      
      panel3.add(delete_txt); 
      panel3.add(delete);
      
      panel4.add(show);
      
 	  setLayout(new GridLayout(4, 1));
 	  add(panel1);
 	  add(panel2);
 	  add(panel3);
 	  add(panel4);
 	  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setVisible(true);	
 	
   }
   
   public void actionPerformed(ActionEvent event) {
 			
 		String cmd = event.getActionCommand();
 		
		if (cmd.equals("Create")) {
 			
 			Student test = new Student();
 			System.out.println("Liste erstellt");
 		}
 		
 		if (cmd.equals("Insert (front)")) {
 			
 			int m = Integer.parseInt(insert_front_matr.getText());
 			String n = insert_front_name.getText();
 			
 			System.out.println("Element eingefuegt");	
 			test.insert(n,m);
 		}
 		
 		if (cmd.equals("Show")) {
 			
 			System.out.println("Ausgabe der Liste");
 			test.print_iterativ();
 		}
 		
 		
 	}
 	
 	public static void main (String[] args) {
 	
 		Gui test = new Gui();
 		test.setLocation(310,200); 
   		test.setVisible(true);
   		test.setSize(600,600);
   		test.pack(); 
 		
 	}
}
 
Servus!
Du solltest einfach eine globale Instanz von Student erzeugen, diese allerdings noch auf null setzen. Später fragst du dann einfach ab, ob die Instanz noch null ist. Falls ja, wurde das ensprechende Object noch nicht erzeugt:
Code:
class Gui extends JFrame implements ActionListener { 
   Student test = null;
   JPanel panel1; 
   JPanel panel2; 
   JPanel panel3;
   JPanel panel4; 
   public GUI{

   ...


public void actionPerformed(ActionEvent event) {
             
         String cmd = event.getActionCommand();
         
        if (cmd.equals("Create")) {
             
                 test = new Student();
                 System.out.println("Liste erstellt");
                       
                        
         }
         
         if (cmd.equals("Insert (front)")) {
             if(test == null){
                           System.err.println("Liste noch nicht erstellt");
                        }
                        else{
               int m = Integer.parseInt(insert_front_matr.getText());
               String n = insert_front_name.getText();
             
               System.out.println("Element eingefuegt");    
               test.insert(n,m);
                        }
 
........
Hoffe mal, dass hilft weiter!
*grüssle*
MeinerEiner
 
Hi,

ich hab es eben grade hinbekommen. Ähnlich wie du gesagt hast, habe ich eine globale Instanz erstellt. Trotzdem vielen Dank.
 
Zurück