AWT Frame in eine eigene klasse auslagern und aufrufen

Java_RY

Mitglied
Hallo zusammen,
ich bin mir sicher Ihr könnt mir helfen, ich wäre sehr dankbar.
Ich bin gerade dabei in einem Weiterbildungskurs das Java zu lernen.
Wir sind nun im Grafischen teil angelangt, wir bauen viele übungsklassen mit Frame.
nun wollte ich mir ein wenig zeit und Tipparbeit erleichtern und habe folgende klasse geschrieben.
DieFrame.java sieht so aus.
Java:
import java.awt.Frame;
import java.awt.event.*;

public class DieFrame extends Frame {
   private static final long serialVersionUID = 1L;
   public DieFrame(String derTitel, int xwert, int ywert)
   {
      setTitle(derTitel);
     setSize(xwert,ywert);
  
  addWindowListener(new WindowAdapter()
     {
       public void windowClosing(WindowEvent e)
       {
         System.exit(0);
       }
     });
   }
}
Nun wollte ich das in meiner Programmklasse mittels
DieFrame df = new DieFrame("Getränke Automat",400,300);
Aufrufen.
Wird auch soweit gemacht allerdings funktioniert das nicht ganz richtig.
Die Größe ist nicht angekommen, der Titel fehlt und schließen des Fensters geht auch nicht.
so sieht die
CHKFrame.java aus.
Java:
import java.awt.*;
import java.awt.event.*;
class CHKFrame extends Frame implements ItemListener
{
   private static final long serialVersionUID = 1L;
   String derTitel="Die Getränke Automat";
   int xwert=400;
   int ywert = 300;
   String str1, str2 , fill;
   CheckboxGroup cg;
   Checkbox cbKaffee;
   Checkbox cbTee;
   Checkbox cbSaft;
   TextField tf;

   public CHKFrame()
   {
     DieFrame df=new DieFrame(derTitel,xwert,ywert);
       cg =new CheckboxGroup();
       cbKaffee = new Checkbox("Kaffee",cg,false);
       cbTee = new Checkbox("Tee",cg,false);
       cbSaft=new Checkbox("Saft",cg,false);
       cbKaffee.addItemListener(this);
       cbTee.addItemListener(this);
       cbSaft.addItemListener(this);
       str1= new String("Sie haben ");
       str2=new String(" gewählt");
       fill="";
       tf=new TextField(40);
       Panel p = new Panel();
       p.add(cbKaffee);
       p.add(cbTee);
       p.add(cbSaft);
       p.add(tf);
       add(p);
   }
   public void itemStateChanged(ItemEvent e)
   {   Object o=e.getSource();
  
       if(o==cbKaffee)
         fill="Kaffee";
       if(o==cbTee)
         fill="Tee";
       if(o==cbSaft)
         fill="Saft";
       tf.setText(str1+fill+str2);
     }
}
Diese wird aus einer weiteren klasse
Starter.java in der die main ist aufgerufen.

public class Starter {
   public static void main(String[] args) {

     CHKFrame tf = new CHKFrame();
     tf.setVisible(true);
   }
}
Wo habe ich mein fehler könnt Ihr mir bitte Helfen.
Vielen dank.
 
Zuletzt bearbeitet von einem Moderator:
Kannst du bitte das nächste mal deinen Code in Code-Tags setzen: [code=java]//JAVA CODE HERE[/code]
 
Ok um es kurz zu machen. Du erstellst ein Klasse DieFrame (übersetzt heißt das übrigens Sterbendes Gerüst deswegen meine Anmerkung. Bitte vermische nicht deutsch und englisch. Schon gar nicht in einem Wort. Außerdem wenn schon, dann wenigstens DasFrame)

Von dieser Klasse erstellst du eine Instanz in einer Klasse die selbst von Frame erbt. Das ist schon einmal Quatsch. Entferne einfach mal das extends Frame aus deiner CHKFrame Klasse. Dann bekommst du ganz viele Fehler weil du versuchst deine Panel und was du alles erzeugst zu deiner Klasse CHKFramechinzuzufügen. Eigentlich willst du das aber ja deiner dieFrame hinzufügen.

Gruß

Claus
 
Die Idee ansich ist nicht schlecht, aber mit System.exit(0); schließt du das ganze Programm - .dispose() ist hier das Suchwort.

Du musst sogar nicht unbedingt von JFrame erben, macht vieles aber einfacherer.

Der Rest ist i. O.
 
Ok erstmal vielen dank für die Hinweise und anmerkungen und Kritik.
Nur so lernt mann 🙂
Ich hab jetzt das ganze etwas umgebaut und es funzt.
Meine Klasse die das Ganze aufruft heist jetzt MeinStarter.java und sieht folgendermaßen aus.
Java:
public class MeinStarter
{
   public static void main(String[] args)
   {
     MeinRahmen df = new MeinRahmen("Getränke",400,300);
     df.setVisible(true);
   }

}
Unterschied zwischen davor und jetzt ist das ich den Rahmen mit Parametern aufrufe und nicht das Programm.
MeinRahmen.java hat nun folgenden aufbau
Java:
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.*;
public class MeinRahmen extends Frame  {
    MeinProgramm f;
     private static final long serialVersionUID = 1L;
   public MeinRahmen(String derTitel, int xwert, int ywert)
   {   
     f=new MeinProgramm();
     setTitle(derTitel);
     setSize(xwert,ywert);
     addWindowListener(new WindowAdapter()
     {
       public void windowClosing(WindowEvent e)
       {
         System.exit(0);
       }     
     });
// Das ist neu hinzugekommen.
     Panel p = new Panel();
     p.add(f.cbTee);
     p.add(f.cbSaft);
     p.add(f.cbKaffee);
     p.add(f.tf);
     add(p);     
   }
}
Ich habe nun nach dem ich den Rahmen gebaut habe die elemente integriert
und zuguterletzt habe ich das Programm angepasst.
MeinProgramm.java sieht nun so aus.
Java:
import java.awt.*;
import java.awt.event.*;



 public class MeinProgramm  implements ItemListener
{

   String str1, str2 , fill;
   CheckboxGroup cg;
   Checkbox cbKaffee;
   Checkbox cbTee;
   Checkbox cbSaft;
   TextField tf;

   public MeinProgramm()
   {
       cg =new CheckboxGroup();
       cbKaffee = new Checkbox("Kaffee",cg,false);
       cbTee = new Checkbox("Tee",cg,false);
       cbSaft=new Checkbox("Saft",cg,false);
       cbKaffee.addItemListener(this);
       cbTee.addItemListener(this);
       cbSaft.addItemListener(this);
       str1= new String("Sie haben ");
       str2=new String(" gewählt");
       fill="";
       tf=new TextField(40);       
   }
   
   public void itemStateChanged(ItemEvent e)
   {   Object o=e.getSource();
       if(o==cbKaffee)
         fill="Kaffee";
       if(o==cbTee)
         fill="Tee";
       if(o==cbSaft)
         fill="Saft";
       tf.setText(str1+fill+str2);
   }
   
}
Die Kritik mit der Namenskonvention war angebracht im nachhinein wenn ich mit etwas abstand mir das angesehen habe habe ich gemerkt wie komisch das ganze klingt. Der hinweis extends Frame zu entfernen war ein gute unterstützung. Danke hierfür Thallius.
Der Hinweis mit System.exit und dispose ist richtig allerdings ist es von mir beabsichtigt das Programm als ganzes abzuschiesen.
Und zu guterletzt sorry das ich mein Code nicht richtig eingetragen hatte, wusste nicht wie das geht.
Im Hinweis "Vor dem ersten Posten" ist es nicht klar ersichtlich gewesen.
auch hierfür danke ich sehr. Man Lernt im leben nicht aus.
 

Zurück
Oben