# JApplet komplett neu zeichnen



## MichiM (11. Feb 2006)

Hallo,

wie genau stelle ich denn einen JPanel-Inhalt neu dar?
Eigentlich hätte ich das über eine der Zeilen 102-104 des StromkreisApplet erreichen wollen, aber es klappt nicht.
Das funktioniert bei der Darstellung der Grafik im oberen Teil des JSplitPanels, nicht aber im unteren, in dem sich die Eingabeelemente befinden.

Ziel: Wenn der Button "Parallelschaltung einbauen" geklickt wird, soll eben nicht nur die Grafik mit der Parallelschaltung dargestellt, sondern gleichzeitig auch unten noch der Eingabedialog für die Daten der Parallelschaltung ergänzt werden.

Hier der Code:

_StromkreisApplet.java:_

```
import javax.swing.*; 

	import java.applet.*;
	import java.awt.*;
	import java.awt.event.*;
	import java.net.URL;
	import javax.imageio.ImageIO;
		
	public class StromkreisApplet extends JApplet implements ActionListener
	{
	  Image MyImage;
	  Canvas Grafik;
	  
	  JButton	StromstaerkeButton,
	  			StromstaerkeButton_parallel_I1,
	  			SpannungButton,
	  			SpannungButton_parallel,
	  			WiderstandButton,
	  			WiderstandButton_parallel,
	  			SchalterButton,
	  			parallelSchaltungEinbauButton,
	  			seriellSchaltungZusatzbirneEinbauButton;
	  
	  TextField StromstaerkeEingabe,
	  			StromstaerkeEingabe_parallel_I1,
	  			SpannungEingabe,
	  			SpannungEingabe_parallel,
	  			WiderstandEingabe,
	  			WiderstandEingabe_parallel;
	  
	  JPanel	BasisPanel,
	  			EingabePanel,
	  			EingabePanel4,
	  			EingabePanel5,
	  			EingabePanel6;
	  
	  ImageIcon StromkreisGrafik;

	  URL leitergrafik_nur_seriell_und_geschlossen = StromkreisApplet.class.getResource( "leitergrafik_nur_seriell_und_geschlossen.bmp" );
	  URL leitergrafik_nur_seriell_und_offen = StromkreisApplet.class.getResource( "leitergrafik_nur_seriell_und_offen.bmp" );
	  URL leitergrafik_parallel_und_geschlossen = StromkreisApplet.class.getResource( "leitergrafik_parallel_und_geschlossen.bmp" );
	  URL leitergrafik_parallel_und_offen = StromkreisApplet.class.getResource( "leitergrafik_parallel_und_offen.bmp" );
	  
	  public void actionPerformed ( ActionEvent e )
	  {
		  if ( e.getSource () == StromstaerkeButton )
		  {
			  Stromkreis.setze_I ( new Float ( StromstaerkeEingabe.getText() ).floatValue() );
			  SpannungEingabe.setText ( new Float ( Stromkreis.lies_U() ).toString() );
		  }

		  if ( e.getSource () == SpannungButton )
		  {
			  Stromkreis.setze_U ( new Float ( SpannungEingabe.getText() ).floatValue() );
			  StromstaerkeEingabe.setText ( new Float ( Stromkreis.lies_I() ).toString() );
		  }	

		  if ( e.getSource () == WiderstandButton )
		  {
			  Stromkreis.setze_R ( new Float ( WiderstandEingabe.getText() ).floatValue() );
			  StromstaerkeEingabe.setText ( new Float ( Stromkreis.lies_I() ).toString() );
		  }

		  if ( e.getSource () == SchalterButton )
		  {
			  try 
			  {
				  if ( Stromkreis.geschlossener_Zustand() == true )
				  {
					  
					  SchalterButton.setText ( "<html>Stromkreis
schlie&en</html>" );
					  
					  if ( Stromkreis.parallelSchaltung_eingebaut() == false )
					  {
						  StromkreisGrafik.setImage( ImageIO.read ( leitergrafik_nur_seriell_und_offen ) );
					  }
					  else
					  {
						  StromkreisGrafik.setImage( ImageIO.read ( leitergrafik_parallel_und_offen ) );
					  }
					  
				  }
				  else
				  {
					  
					  SchalterButton.setText ( "<html>Stromkreis
&ffnen</html>" );
					  
					  if ( Stromkreis.parallelSchaltung_eingebaut() == false )
					  {
						  StromkreisGrafik.setImage( ImageIO.read ( leitergrafik_nur_seriell_und_geschlossen ) );
					  }
					  else
					  {
						  StromkreisGrafik.setImage( ImageIO.read ( leitergrafik_parallel_und_geschlossen ) );
					  }

				  }
	
				  Stromkreis.Hauptteil_Zustand_in_Gegenteil_versetzen();

				  this.validate(); // alles mal neu zeichnen...
				  BasisPanel.updateUI(); 
				  EingabePanel.updateUI();
				  
			  }
			  catch ( Exception ex )
			  {
			  }

		  }

		  if ( e.getSource () == parallelSchaltungEinbauButton )
		  {
			  
			  try 
			  {
				  if ( Stromkreis.parallelSchaltung_eingebaut() == true )
				  {

					  parallelSchaltungEinbauButton.setText ( "<html>Parallelschaltung
einbauen</html>" );
					  
					  if ( Stromkreis.geschlossener_Zustand() == true )
					  {
						  StromkreisGrafik.setImage( ImageIO.read ( leitergrafik_nur_seriell_und_geschlossen ) );
					  }
					  else
					  {
						  StromkreisGrafik.setImage( ImageIO.read ( leitergrafik_nur_seriell_und_offen ) );						  
					  }
				  }
				  else
					  
				  {

					  parallelSchaltungEinbauButton.setText ( "<html>Parallelschaltung
ausbauen</html>" );

					  if ( Stromkreis.geschlossener_Zustand() == true )
					  {
						  StromkreisGrafik.setImage( ImageIO.read ( leitergrafik_parallel_und_geschlossen ) );
					  }
					  else
					  {
						  StromkreisGrafik.setImage( ImageIO.read ( leitergrafik_parallel_und_offen ) );
					  }

				  }

				  Stromkreis.parallel_Schaltung_Einbauzustand_in_Gegenteil_versetzen();
				  //Stromkreis.parallel_Schaltung_eingebaut = false;
				  this.validate(); // alles mal neu zeichnen...
				  BasisPanel.updateUI(); 
				  
			  }
			  catch ( Exception ex )
			  {
				  	System.out.println ( ex );
			  }

		  }

		  
	  }
	
	  public void init()
	  {

		  setSize ( new Dimension ( 870, 480));
		  	
		  try
		   {
			  	setLayout(new BorderLayout () );
			  	
			  	Container contentPane = getContentPane(); 
			    
			  	BasisPanel = new JPanel();
			    add ( BasisPanel, BorderLayout.CENTER );
			    
			  	//__________________________________________________________
	
			    JPanel EingabePanel1_seriell = new JPanel();
			    EingabePanel1_seriell.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
			    
			    Label StromstaerkeLabel = new Label ( "Stromstärke I:" );
			    EingabePanel1_seriell.add ( StromstaerkeLabel );
			    
			  	StromstaerkeEingabe = new TextField ( 3 );
			  	StromstaerkeEingabe.setText ( new Float ( Stromkreis.lies_I() ).toString() );
			  	EingabePanel1_seriell.add ( StromstaerkeEingabe );
			  	
			  	Label StromEinheitLabel = new Label ( " A " );
			  	EingabePanel1_seriell.add ( StromEinheitLabel );
			  	
			  	StromstaerkeButton = new JButton ("setze Stromstärke");
			  	EingabePanel1_seriell.add ( StromstaerkeButton );
			  	
			  	StromstaerkeButton.addActionListener ( this );
	
			  	//__________________________________________________________
	
			    JPanel EingabePanel2_seriell = new JPanel();
			    EingabePanel2_seriell.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
			  	
			  	Label SpannungLabel = new Label ( "Spannung U:" );
			  	EingabePanel2_seriell.add ( SpannungLabel );
			  	
			  	SpannungEingabe = new TextField ( 3 );
			  	EingabePanel2_seriell.add ( SpannungEingabe );
			  	SpannungEingabe.setText ( new Float ( Stromkreis.lies_U() ).toString() );
			  	
			  	Label SpannungEinheitLabel = new Label ( " V " );
			  	EingabePanel2_seriell.add ( SpannungEinheitLabel );
			  	
			  	SpannungButton = new JButton ("setze Spannung");
			  	EingabePanel2_seriell.add ( SpannungButton );
			  	
			  	SpannungButton.addActionListener ( this );
	
			  	//__________________________________________________________
	
			    JPanel EingabePanel3_seriell = new JPanel();
			    EingabePanel3_seriell.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
			  	
			  	Label WiderstandLabel = new Label ( "Widerstand R:" );
			  	EingabePanel3_seriell.add ( WiderstandLabel );
			  	
			  	WiderstandEingabe = new TextField ( 3 );
			  	EingabePanel3_seriell.add ( WiderstandEingabe );
			  	WiderstandEingabe.setText ( new Float ( Stromkreis.lies_R() ).toString() );
			  	
			  	Label WiderstandEinheitLabel = new Label ( " Ohm " );
			  	EingabePanel3_seriell.add ( WiderstandEinheitLabel );
			  	
			  	WiderstandButton = new JButton ("setze Widerstand");
			  	EingabePanel3_seriell.add ( WiderstandButton );
			  	
			  	WiderstandButton.addActionListener ( this );
	
			  	//__________________________________________________________
			  	
			  	EingabePanel = new JPanel();
			  	EingabePanel.setLayout ( new FlowLayout () );
			  	
			  	JPanel EingabePanel_seriell = new JPanel();
			  	EingabePanel_seriell.setLayout ( new BoxLayout ( EingabePanel_seriell,
							BoxLayout.Y_AXIS ) );
			  	EingabePanel_seriell.add ( EingabePanel1_seriell );
			  	EingabePanel_seriell.add ( EingabePanel2_seriell );
			  	EingabePanel_seriell.add ( EingabePanel3_seriell );
			  	
			  	EingabePanel.add ( EingabePanel_seriell );
			    
			    if  ( Stromkreis.parallelSchaltung_eingebaut() == true )/*||
			    	( Stromkreis.parallelSchaltung_eingebaut() == false ) )*/
			    {
				    JPanel EingabePanel1_parallel = new JPanel();
				    EingabePanel1_seriell.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
				    
				    Label StromstaerkeLabel_parallel_I1 = new Label ( "Stromstärke I:" );
				    EingabePanel1_seriell.add ( StromstaerkeLabel_parallel_I1 );
				    
				  	StromstaerkeEingabe_parallel_I1 = new TextField ( 3 );
				  	StromstaerkeEingabe.setText ( new Float ( Stromkreis.lies_I() ).toString() );
				  	EingabePanel1_seriell.add ( StromstaerkeEingabe_parallel_I1 );
				  	
				  	Label StromEinheitLabel_parallel_I1 = new Label ( " A " );
				  	EingabePanel1_seriell.add ( StromEinheitLabel_parallel_I1 );
				  	
				  	StromstaerkeButton_parallel_I1 = new JButton ("setze Stromstärke");
				  	EingabePanel1_seriell.add ( StromstaerkeButton_parallel_I1 );
				  	
				  	StromstaerkeButton.addActionListener ( this );
		
				  	//__________________________________________________________
		
				    JPanel EingabePanel2_parallel = new JPanel();
				    EingabePanel2_seriell.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
				  	
				  	Label SpannungLabel_parallel = new Label ( "Spannung U:" );
				  	EingabePanel2_seriell.add ( SpannungLabel_parallel );
				  	
				  	SpannungEingabe_parallel = new TextField ( 3 );
				  	EingabePanel2_seriell.add ( SpannungEingabe_parallel );
				  	SpannungEingabe_parallel.setText ( new Float ( Stromkreis.lies_U() ).toString() );
				  	
				  	Label SpannungEinheitLabel_parallel = new Label ( " V " );
				  	EingabePanel2_seriell.add ( SpannungEinheitLabel_parallel );
				  	
				  	SpannungButton_parallel = new JButton ("setze Spannung");
				  	EingabePanel2_seriell.add ( SpannungButton_parallel );
				  	
				  	SpannungButton_parallel.addActionListener ( this );
		
				  	//__________________________________________________________
		
				    JPanel EingabePanel3_parallel = new JPanel();
				    EingabePanel3_seriell.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
				  	
				  	Label WiderstandLabel_parallel = new Label ( "Widerstand R:" );
				  	EingabePanel3_seriell.add ( WiderstandLabel );
				  	
				  	WiderstandEingabe_parallel = new TextField ( 3 );
				  	EingabePanel3_seriell.add ( WiderstandEingabe_parallel );
				  	WiderstandEingabe_parallel.setText ( new Float ( Stromkreis.lies_R() ).toString() );
				  	
				  	Label WiderstandEinheitLabel_parallel = new Label ( " Ohm " );
				  	EingabePanel3_seriell.add ( WiderstandEinheitLabel );
				  	
				  	WiderstandButton_parallel = new JButton ("setze Widerstand");
				  	EingabePanel3_seriell.add ( WiderstandButton_parallel );
				  	
				  	WiderstandButton_parallel.addActionListener ( this );
			    	
			    	JPanel EingabePanel_parallel = new JPanel();
				  	EingabePanel_parallel.setLayout ( new BoxLayout ( EingabePanel_parallel,
							BoxLayout.Y_AXIS ) );
				  	EingabePanel_parallel.add ( EingabePanel1_parallel );
				  	EingabePanel_parallel.add ( EingabePanel2_parallel );
				  	EingabePanel_parallel.add ( EingabePanel3_parallel );
				  	
				    EingabePanel.add ( EingabePanel_parallel );

			    }
			    
			    EingabePanel4 = new JPanel();
			    EingabePanel4.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
			  	SchalterButton = new JButton ("<html>Stromkreis
&ffnen</html>");
			  	SchalterButton.addActionListener ( this );
			  	EingabePanel4.add ( SchalterButton );
			  	add ( SchalterButton/*EingabePanel4*/, BorderLayout.WEST );

			    EingabePanel5 = new JPanel();
			    EingabePanel5.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
			  	parallelSchaltungEinbauButton = new JButton ("<html>Parallelschaltung
einbauen</html>");
			  	parallelSchaltungEinbauButton.addActionListener ( this );
			  	EingabePanel5.add ( parallelSchaltungEinbauButton );
			  	add ( parallelSchaltungEinbauButton, BorderLayout.EAST );
			  	
			  	EingabePanel6 = new JPanel();
			    EingabePanel6.setLayout ( new FlowLayout ( FlowLayout.LEFT, 0, 0 ) );
			  	seriellSchaltungZusatzbirneEinbauButton = new JButton ("<html>Zusatzbirne in Seriellschaltung einbauen</html>");
			  	seriellSchaltungZusatzbirneEinbauButton.addActionListener ( this );
			  	EingabePanel6.add ( seriellSchaltungZusatzbirneEinbauButton );
			  	add ( seriellSchaltungZusatzbirneEinbauButton, BorderLayout.NORTH );

			  	StromkreisGrafik = new ImageIcon ( ImageIO.read ( leitergrafik_nur_seriell_und_geschlossen ) );
			  	JSplitPane splitPane = new JSplitPane
			  	(
			    	     JSplitPane.VERTICAL_SPLIT,
			    	     new JLabel ( StromkreisGrafik ),
			    	     EingabePanel
			     );
			    	  
			  	splitPane.setOneTouchExpandable ( true );
			  	BasisPanel.add(splitPane);
			  	
			    this.setVisible ( true );

		   }
		
		  catch ( Exception e )
		  {
		  }
		  
		}
	  
	}
```


_Stromkreis.java:_

```
import javax.swing.JButton;

public class Stromkreis
{
	private static boolean geschlossen = true;
	public static boolean parallel_Schaltung_eingebaut = false;
	
	private static float I = 0.25f;
	private static float U = 12;
	private static float R = U / I;
	
	public static float lies_I()
	{
		return I;
	}

	public static float lies_U()
	{
		return U;
	}
	
	public static float lies_R()
	{
		return R;
	}
	

	public static void setze_I ( float I )
	{
		Stromkreis.I = I;
		Stromkreis.U = Stromkreis.R / Stromkreis.I;
		//berechne_U();
	}

	public static void setze_U ( float U )
	{
		Stromkreis.U = U;
		Stromkreis.I = Stromkreis.R / Stromkreis.U;
		//berechne_I();
	}
	
	public static void setze_R ( float R )
	{
		Stromkreis.R = R;
		Stromkreis.I = Stromkreis.U / Stromkreis.R;
		//berechne_I();
	}
	
	private static void berechne_I ()
	{
		Stromkreis.I = Stromkreis.U / Stromkreis.R;
	}	

	private static void berechne_U ()
	{
		//Stromkreis.U = 3;
		Stromkreis.U = Stromkreis.R * Stromkreis.I;
	}	
	
	private static void berechne_R ()
	{
		Stromkreis.R = Stromkreis.U / Stromkreis.I;
	}
	
	public static boolean geschlossener_Zustand ()
	{
		return Stromkreis.geschlossen;
	}
	
	public static void Hauptteil_Zustand_in_Gegenteil_versetzen ()
	{
		if ( Stromkreis.geschlossen == true )
		{
			Stromkreis.geschlossen = false;
		}
		else
		{
			Stromkreis.geschlossen = true;
		}
	}
	
	private void Hauptteil_schliessen ()
	{
		geschlossen = true;
	}
	
	public static boolean parallelSchaltung_eingebaut()
	{
		return Stromkreis.parallel_Schaltung_eingebaut;
	}
	
	public static void parallel_Schaltung_Einbauzustand_in_Gegenteil_versetzen()
	{
		if ( Stromkreis.parallel_Schaltung_eingebaut == true )
		{
			Stromkreis.parallel_Schaltung_eingebaut = false;
		}
		else
		{
			Stromkreis.parallel_Schaltung_eingebaut = true;
		}
	}
	
}
```

Gruß Michi


----------



## dieta (12. Feb 2006)

probier's mal mit this.repaint()... Wenn du das in deiner StromkreisApplet-Klasse ausführst, müsste es funktionieren


----------



## MichiM (13. Feb 2006)

Hallo,

der Fehler resultierte einfach aus meiner Fehlannahme, dass beim Neuzeichnen die Methode init() neu aufgerufen wird.
So hab ich nun also jegliche Änderungen, die beim Neuzeichnen berücksichtigt werden sollen, in die Methode actionPerformed() aufgenommen und es klappt. Zumindest das. 



Was allerdings immer noch Probleme macht, ist der Cache und zwar in beiden Browsern, in denen ich teste - Firefox und IE. Nun verwende ich ja bereits ein JAR für alle möglichen Ressourcen und klicke obendrein noch immer fleißig "reload", aber wenn so ein JApplet erstmal geladen wurde, ist es eben drin im Cache und wird scheinbar erst bei einem Zugriff,
der etwa einen Tag später (scheinbar wird wirklich die Zeit abgefragt?) stattfindet, neu geladen. Auch das Löschen des Cache hilft nicht weiter...

Gibt es denn keine Möglichkeit, so ein Applet gezielt ausm Cache zu schmeißen?

Gruß Michi


----------



## L-ectron-X (13. Feb 2006)

Ich glaube nicht,dass es per Java-Code geht, ein Applet hat keine Rechte den Browser zu steuern, oder auf irgendeine Art und Weise auf Dateiebene rumzuwerkeln.
Du kannst aber den Browsern sagen, dass sie den Cache beim Schließen des Browsers löschen sollen.
Außerdem kann es sinnvoll sein, den Cache so klein wie möglich zu halten.


----------

