# Frage zum Aufbau eines JApplets



## dewenni (14. Feb 2007)

Hallo,
ich habe folgendes Applet gebastelt: Applet
(die 2 oberen roten Linen lassen sich verscheiben)

Soweit so gut. Da ich am Anfang der Programmierung noch keinerlei Erfahrungen mit Java hatte, ist die Programmierung nicht gerade sauber. Ich möchte das ganze etwas überarbeiten. Eine Sache ist z.B. das ich AWT und Swing gemischt habe.

Der Aufbau ist folgendermaßen:
Jedes Diagramm ist eine eigene Klasse die jeweils in einer eigenen *.java Datei geschrieben ist.
Momentan sind diese Klassen noch von Canvas abgeleitet.


```
//#### Klasse für Sägezahnspannung ######################################################
public class u_panel extends java.awt.Canvas
{
        //Variablen
	public static int u_steuer_y=100;
	public static int u_steuer_x=20;
	
	//---- Konstruktor
    public u_panel()
    {
  	  super();
  	  setBackground(java.awt.Color.white);
  	  setBounds(24,24,500,180);					
     }

      
    // Überschreiben der Methode paint() für u_canvas
    public void paint(Graphics g)
    {
    	Font klein = new Font("Arial", Font.PLAIN, 10);  
    	
    	g.drawString("Sägezahn", 20, 165);

    	//Koorditatensystem
        g.setColor(Color.black);
        g.drawString("t", 445,165);
        g.drawLine(20,20,20,150);
        g.drawLine(20,150,450,150);
 
        usw.....
```

Des weiteren gibt es eine "HauptKlasse" die von JApplet abgeleitet ist. Dort wird von jeder der Klassen die die Diagramme enthalten ein Objekt erzeugt.


```
u_panel u_jp = new u_panel();
```

diese Objekte werden dann in ein GridBagLayout gesetzt:


```
GridBagLayout gbl=new GridBagLayout();
setLayout(gbl);
GridBagConstraints gbc=new GridBagConstraints();
	
gbc.fill=GridBagConstraints.BOTH;		
gbc.insets = new Insets(5,5,5,5);	

//Sägezahn
gbc.anchor = gbc.WEST;
gbc.gridx = 0;  							
gbc.gridy = 0; 							  
gbc.gridheight = 1;
gbc.gridwidth = 1;
gbl.setConstraints(u_jp, gbc);
add(u_jp);

usw...
```

Das funktioniert zwar ganz gut, ist aber wohl nicht die sauberste Lösung.
Wie kann ich das besser machen? Ich habe bereits versucht Canvas in JComponent zuändern und paintComponent anstelle von paint zu benutzen, aber das funktoniert irgendwie nicht. Es wird dann jedenfalls nichts mehr angezeigt.

Eine weitere Frage, die eigentlich ganz einfach klingt ist, wie ich das bei dem Schaltbild mache. Im moment passiert das noch alles in der HauptKlasse. Ich lade das Bild in ein Icon und setze dieses in ein Label. Das Label setze ich dann genau wie die anderen Objekte in das GridBagLayout

Wie mache ich das wenn ich auch das Schaltbild in einer extra .java Datei bzw. Klasse erstellen möchte und das dann genau wie die anderen in der Hauptklasse ins Layout setzen will.
Ich habe einiges ausprobiert, aber irgendwie klappt es nicht. Wie müsste die Klasse grob aussehen und wovon müsste ich sie ableiten?

Die ganzen Möglichkeiten machen mich noch verrückt (JComponent, JFrame, JPanel, JLabel, Container, Canvas, usw.)

Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt.
Also in erster Linie geht es mir darum zu klären wie man das am saubersten aufbauen würde und wovon ich die einzelnen Klassen am besten ableiten sollte.

Vielen Dank schonmal für eure Hilfe

Gruß Sven


----------



## André Uhres (14. Feb 2007)

http://www.java-forum.org/de/viewtopic.php?p=243880#243880


----------



## dewenni (15. Feb 2007)

Danke für den Link.
Leider bringt mich das nicht so wirklich weiter. Wahrscheinlich mangelt es mir noch etwas am Verständnis.
Hat nich noch jemand einen Vorschlag wie ich das am besten aufbauen sollte und wovon ich die einzelnen Klassen am besten ableiten sollte.


----------



## Beni (16. Feb 2007)

Hast du auch das Applet durch ein JApplet ersetzt, als du deine Diagramme von JComponent erben liesest? Wenn man Swing benutzt, sollte keine einzige AWT-Componente mehr verwendet werden.

Deine Schaltbild-Klasse müsste gleich aussehen, wie deine Diagramm-Klassen. Leider sagt "es klappt irgendwie nicht" nicht sehr viel aus...


----------



## dewenni (16. Feb 2007)

Ich habe es heute nochmal getestet - und siehe da, es funktioniert.
Ich habe jetzt alle Canvas durch JComponent ersetzt. Somit müsste ich eigentlich komplett auf swing gewechselt haben.
Mein Fehler lag wohl beim repaint.

Dafür erstmal Danke!

Jetzt nochmal zum Schaltbild:
Mein Ziel ist es das Schaltbild in einer extra Klasse zu laden. Auf diesem Schaltbild möchte ich dann mit der paint-Methode noch etwas zeichnen. Im Moment lade ich das Bild ja noch als ImageIcon in ein JLabel. Das ist ja dann wahrscheinlich hinfällig, oder?
Das Bild mit der darüberliegenden Zeichnung möchte ich dann zusammen in der Hauptklasse (dem JApplet) in das Layout legen. Sprich in der Hauptklasse ein Objekt der Schaltbild-Klasse erzeugen und dieses dann ins Layout legen.
Soweit verständlich?

Jetzt nochmal meine Frage, von was kann ich die Klasse für das Schaltbild ableiten,
wie lade ich dann das Bild und wie kann ich dann darauf zeichenen (so das man das Bild darunter noch sieht).

Bin für eure Hilfe echt dankbar!!!


----------



## André Uhres (16. Feb 2007)

Beni hat gesagt.:
			
		

> ..Wenn man Swing benutzt, sollte keine einzige AWT-Componente mehr verwendet werden..


Dieses Ideal sollte man natürlich möglichst anstreben.
Es ist aber prinzipiell auch möglich, eine AWT-Komponente in einem Swing-Programm zu verwenden 
(aus welchen Gründen auch immer), solange man einige einfache Richtlinien beachtet (sind in meinen Link oben nachzulesen).


----------



## dewenni (16. Feb 2007)

So, bin wieder ein Stück weiter.
Es funktioniert jetzt so weit das ich das Bild in einer extra Klasse laden kann und dann wie gewünscht im JApplet ins Layout setzen kann.
Jetzt bleiben leider immernoch zwei Probleme. 
1. ist das gif jetzt nicht mehr animiert und 2. klappt das mit dem darauf zeichnen noch nicht.

Beispiel-Klasse für das laden des Schaltbildes

```
public class sb extends JComponent {

   private BufferedImage image_url;

   public sb(){
    image_url = loadUrlImage();
   } 
    
	public void paint(Graphics g){
      super.paint(g);
      g.drawLine(40, 40, 100, 100);
      g.drawImage(image_url, 0, 0, null);
	} 

	private URL url;{
		try {url = new URL("url zum animierten .gif");
	    } catch (MalformedURLException e) {e.printStackTrace();}
	}
	   
    private BufferedImage loadUrlImage(){
    	BufferedImage image_url = null;
	    try {
	        InputStream is = new BufferedInputStream(url.openStream());
	        image_url = ImageIO.read(is);
	           
	        } 
	    catch (IOException e) { }
	        
	    return image_url;
	} 
		
}
```


verkürzte JApplet-Klasse

```
public class test extends javax.swing.JApplet implements Runnable{

	sb sb =new sb();
	
	Thread pwmThread = new Thread();
	boolean running = true;
	
	//Init
	public void init(){
		
		//Thread starten
		Thread pwmThread = new Thread(this);
		pwmThread.start(); 
			
		Container container = getContentPane();
	    container.setBackground(Color.white);
		
		GridBagLayout gbl=new GridBagLayout();
		setLayout(gbl);
		GridBagConstraints gbc=new GridBagConstraints();
			               
		gbc.fill=GridBagConstraints.BOTH;		
		gbc.insets = new Insets(5,5,5,5);
		
		
		Dimension d = new Dimension(500,300);
		sb.setPreferredSize(d);
		
		gbc.anchor = gbc.WEST;
		gbc.gridx = 0;  							
		gbc.gridy = 0; 							  
		gbc.gridheight = 1;
		gbc.gridwidth = 1;
		gbl.setConstraints(sb, gbc);
		
		add(sb);

		
	}
	



//	##### Run ###############################################################  
	  public void run() { 

			  try
	          {
	            // Wait 500milliseconds before continuing
	            pwmThread.sleep(500);
	          }
	          
			  catch (InterruptedException e)
	          {System.out.println(e);} 
		  	  
		  }
	  
	


//##### Start ###############################################################  
public void start() { 
	  

}


//##### Stop ################################################################
public void stop() {
  // stoppe Ausführung
	  
	 running = false;
     pwmThread = null;
     
}


//##### destroy #############################################################
public void destroy() {
  // initialisierte Ressourcen freigeben
}

	 
	
}
```

Kann mir da noch jemand weiterhelfen?
Muss ich jetzt noch eine Komponente anlegen, auf der ich zeichne und diese dann auf die JComponent vom Bild legen?

Warum ist das Schaltbild jetzt nicht mehr animiert?
Mit der ImageIcon auf JLabel-Methode war es animiert

Gruß Sven


----------

