# Applet-karte hängt im appletviewer



## RDav (18. Mrz 2007)

Hi,
ich habe hier eine karte, ein raster eher. bei dieser karte werden alle user aus der db als punkt ihrer jeweiligen koordinate gezeigt und beim mouseover über eines der punkte, wird der name des users gezeigt

mein problem ist, dass das applet im appletviewer hängt und beim test mit tomcat, xampp und firefox funktioniert sie gar nicht. ich schätze das liegt daran, dass die ganze mysql beim bewegen der maus immer und immer wieder geladen werden muss, aber ich weiß nicht, wie ich es anders lösen könnte

ich erhoffe mir hier hilfe, da ich sonst nicht weiß, wo ich fragen soll

DiV RDav



hier ist der code der weltkartesql.class , ich denke die mysql-klasse brauch ich nicht posten



```
import java.util.* ;

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;


  


public class Weltkartesql extends Applet
   implements MouseMotionListener {

   		int width, height;
   		int mx, my;  // the mouse coordinates
   		int sx, sy; //string coordinates
   		Image img;
   		Image backbuffer;
   		Graphics backg;
   		ResultSet res;
   		int R,G,B;
		

		String name;
   		String partei;
   		int xKoord;
   		int yKoord;
   		
   		public void init() {
      		width = getSize().width;
      		height = getSize().height;
 	     	img = getImage(getDocumentBase(), "map1.jpg");

      		backbuffer = createImage( width, height );
      		backg = backbuffer.getGraphics();
      		backg.setColor( Color.white );
      		
      		/*			
		temp.txt - 2
			*/

      		

	
  
  		addMouseMotionListener( this );

   		}
   		
   		public void usersposition() {
   		MySQL mysql = new MySQL();
   		if (mysql.isAccessible() == true) 
   			{
   		//		System.out.println ("Möglich zu verbinden");
   				try {
   					mysql.connect();
   					} catch (ClassNotFoundException  e) {
               			e.printStackTrace();
   					} catch (SQLException e) {
   						e.printStackTrace();
   					}
   				if (mysql.isConnected() == true)
   					{
   		//				System.out.println ("Verbunden");
   						//VERBUNDEN!!!!!
   						try {
   						res = mysql.getQuery("SELECT Name, xKoord, yKoord, Partei FROM user");
   						while(res.next()){

							String name = res.getString(1);
							int xKoord = res.getInt(2);
							int yKoord = res.getInt(3);
							String partei = res.getString(4);
							
		//					System.out.println("Name: " + name + "  x: " + xKoord + "  y:" + yKoord + "  Partei: " + partei);
							if (partei.equals("AoAI")) {
								R = 106;
								G = 158;
								B = 255;
							}
							if (partei.equals("keine")) {
								R = 180;
								G = 180;
								B = 180;
							}
							if (partei.equals("GO4")) {
								R = 219;
								G = 163;
								B = 100;
							}
							if (partei.equals("LGem")) {
								R = 0;
								G = 0;
								B = 0;
							}
							if (partei.equals("MU")) {
								R = 255;
								G = 70;
								B = 70;
							}
							if (partei.equals("LW")) {
								R = 240;
								G = 255;
								B = 70;
							}
							
							backg.setColor (new Color(R, G, B ));

							   
		      				backg.fillRect((width/100) * (xKoord-1),(height/100) * (yKoord-1) ,(width/100),(height/100));
		      				
		      				 backg.setColor(Color.green);

					            if (mx/6 == xKoord && my/6 == yKoord)
					            {
					            	backg.drawString(" ("+mx/6+","+my/6+")   "+name ,sx,sy); //Koordinatenname
					            } else
					            {
					            	backg.drawString(" ("+mx/6+","+my/6+")",sx,sy); //Koordinatenname
					            }
						}
						mysql.close(); 
   						} catch (SQLException e) {
   								e.printStackTrace();
   								System.out.println ("Fehler");
   						}
   					} 
   				else 
   					{
   						System.out.println ("Nicht Verbunden");
   					}
   			}   
 		else 
   			{
   				System.out.println("Nicht möglich zu verbinden");
   			}
   		   
 
   		}
   			

  		
    				   			

   		public void mouseMoved( MouseEvent e ) {
      		mx = e.getX();
      		my = e.getY();
      		mx = mx+6;
      		my = my+6;
      		showStatus( "Mouse at (" + mx/6 + "," + my/6 + ")" );
      		backg.drawImage( img, 0, 0, this ); 
      			
      		if (mx > (width/100)*80) { sx = mx - (width/100)*20;} else {sx = mx;}
      		if (my < (height/100)*2) { sy = my + (width/100)*5;} else {sy = my;}
      	 
      	 	backg.setColor( Color.black );
      		for ( int i = 0; i < 100; ++i ) {
         		backg.drawLine( i * width/100, height  , i * width /100, 0 );    //Koordinatenlinien y
         		backg.drawLine( 0 ,i * height/100 , width , i * height /100 );   //Koordinatenlinien x
      		}
      		
      	   usersposition();
      		repaint();
      		e.consume();
   		}
   		
   
   		public void mouseDragged( MouseEvent e ) { }

   		public void update( Graphics g ) {
			g.drawImage( backbuffer, 0, 0, this );
   		}



   		public void paint( Graphics g ) {
        	g.drawImage( backbuffer, 0, 0, this );
    	}
    	



    	
	}
```


----------



## Marco13 (18. Mrz 2007)

Bin zwar kein MySQL-Experte, aber dass er da hängt, wundert mich nicht - es sollte (hoffentlich!) möglich sein, die Datenbank "im Hintergrund" (d.h. als Instanzvariable) offen zu halten, und dann nurnoch die Abfragen in der mouseMoved-Methode zu machen (was vielleicht(?)) immernoch langsam ist, aber zumindest schneller sein dürfte, als bisher). Sinngemäß

```
class Hauptklasse
{
    private MySQL mysql = null;
    private boolean initSuccessful = false;

    public void init()
    {
         mysql = new MySQL();

//----------------- Anfangs-teil aus userPosition -------
         if (mysql.isAccessible() == true)
            {
         //      System.out.println ("Möglich zu verbinden");
               try {
                  mysql.connect();
                  } catch (ClassNotFoundException  e) {
                        e.printStackTrace();
                  } catch (SQLException e) {
                     e.printStackTrace();
                  }
               if (mysql.isConnected() == true)
                  {
         //            System.out.println ("Verbunden");
                     //VERBUNDEN!!!!!
                  
                 initSuccessful = true; //-------------------------------------- Merken, dass alles OK war

                  //---mysql.close(); // das würde wohl eher in einer stop-Methode stehen !?

//----------------- End-teil aus userPosition -------

                     } catch (SQLException e) {
                           e.printStackTrace();
                           System.out.println ("Fehler");
                     }
                  }
               else
                  {
                     System.out.println ("Nicht Verbunden");
                  }
            }   
      else
            {
               System.out.println("Nicht möglich zu verbinden");
            }
    } 
    //--------------- Ende der init-Methode

                  


     public void usersposition() {

         if (!initSuccessful)
         {
             return;
         }
          
          // Hier braucht die DB jetzt nichtmehr geöffnet zu werden. Die Anfrage kann direkt losgeeschickt werden

                      try {
                     res = mysql.getQuery("SELECT Name, xKoord, yKoord, Partei FROM user");
                     while(res.next()){
                ....
         }
```


Ich könnte mir aber auch vorstellen, dass eventuell die Abfrage

```
res = mysql.getQuery("SELECT Name, xKoord, yKoord, Partei FROM user");
```
ziemlich lange dauert (nochmal: Bin kein SQL-Experte, und weiß nichts über die Geschwindigkeit einer solchen Abfrage) und wenn die bei JEDER mausbewegung gemacht wird, bremst DAS evtl das ganze auch ziemlich aus. Dann gäbe es vielleicht noch andere Möglichkeiten, das zu beschleunigen. Z.B. könnte man das Abfrage-Raster vergröbern, sich immer die Ergebnisse der LETZTEN Abfrage speichern, und evtl. nur eine NEUE Abfrage machen, wenn die Maus von einem Raster-Feld in ein anderes bewegt wurde. 
Oder man speichert sich beim Start des Applets (z.B. in einer HashSet) die Positionen, die _überhaupt_ Daten enthalten - dann kann man in 'userPosition' zuerst in der HashSet nachsehen, ob an dieser Stelle etwas ist, und WENN dort etwas ist, fragt man in der DB an, WAS dort ist. Aber das ist erstmal nur ein spontaner Einfall, ggf. muss man sich da nochmal genauer Gedanken drüber machen.


----------



## RDav (18. Mrz 2007)

also... ich habe einige tipps von dir übernommen.... und auch eine list eingefügt... weil die dateien nicht bei jeder mausbewegung abgerufen werden müssen.....

letztendlich funktioniert es fast ohne ruckeln im appletviewer, aber beim homeserver-test zeigt die konsole bei jeder mausbewegung nur:



> Nicht möglich zu verbinden
> Nicht möglich zu verbinden
> Nicht möglich zu verbinden
> Nicht möglich zu verbinden
> ...



liegt es an meinem tomcat? was hab ich falsch eingestellt?
hier ist mein überarbeiteter code




```
import java.util.* ;

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.sql.*;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;


  


public class Weltkartesql extends Applet
   implements MouseMotionListener {

   		int width, height;
   		int mx, my;  // the mouse coordinates
   		int sx, sy; //string coordinates
   		Image img;
   		Image backbuffer;
   		Graphics backg;
   		ResultSet res;
   		int R,G,B;
		String name;
   		String partei;
   		int xKoord;
   		int yKoord;
   		int counter;
   		private MySQL mysql = null;
    	private boolean initSuccessful = false; 
    	List<String> listuserpartei = new ArrayList<String>(); 
    	List<Integer> listxykoord = new ArrayList<Integer>(); 
   		
   		
   		public void init() {
      		width = getSize().width;
      		height = getSize().height;
 	     	img = getImage(getDocumentBase(), "map1.jpg");

      		backbuffer = createImage( width, height );
      		backg = backbuffer.getGraphics();
      		backg.setColor( Color.white );
      		
	      	/*			
			temp.txt - 2
			*/
			
			mysql = new MySQL();
			         if (mysql.isAccessible() == true)
			            {
			         //      System.out.println ("Möglich zu verbinden");
			               try {
			                  	mysql.connect();
			               } catch (ClassNotFoundException  e) {
			                    e.printStackTrace();
			               } catch (SQLException e) {
			                    e.printStackTrace();
			               }
			               if (mysql.isConnected() == true)
			               {
			         			//System.out.println ("Verbunden");
			                	//VERBUNDEN!!!!!			                 
			                 	initSuccessful = true; //alles OK war
			               }
			               else
			               {
			                    System.out.println ("Nicht Verbunden");
			               }
			            }   
			      	else
			            {
			               System.out.println("Nicht möglich zu verbinden");
			            } 
			            	
			            	
		    if (!initSuccessful)
         	{
             	return;
         	} else {
            try {
            	res = mysql.getQuery("SELECT Name, xKoord, yKoord, Partei FROM user");
                while(res.next()){
                	String name = res.getString(1);
					int xKoord = res.getInt(2);
					int yKoord = res.getInt(3);
					String partei = res.getString(4);
					
					counter = counter + 2;
					
					listuserpartei.add(name);
					listuserpartei.add(partei);
					listxykoord.add(xKoord);
					listxykoord.add(yKoord);
					
					//System.out.println("Name: " + name + "  x: " + xKoord + "  y:" + yKoord + "  Partei: " + partei);
				}
         	} catch (SQLException e) {
              	e.printStackTrace();
                System.out.println ("Fehler");
         	}
         	counter = counter - 1;
         	} 
		
		
  		addMouseMotionListener( this );
   		}

   		
   		public void usersposition() {					
					
					for (int i=0;i < counter;i++)
					{
					name = listuserpartei.get(i);
					xKoord = listxykoord.get(i);
					i++;
					partei = listuserpartei.get(i);
					yKoord = listxykoord.get(i);
					
					if (partei.equals("AoAI")) {
						R = 106;
						G = 158;
						B = 255;
					}
					if (partei.equals("keine")) {
						R = 180;
						G = 180;
						B = 180;
					}
					if (partei.equals("GO4")) {
						R = 219;
						G = 163;
						B = 100;
					}
					if (partei.equals("LGem")) {
						R = 0;
						G = 0;
						B = 0;
					}
					if (partei.equals("MU")) {
						R = 255;
						G = 70;
						B = 70;
					}
					if (partei.equals("LW")) {
						R = 240;
						G = 255;
						B = 70;
					}
							
					backg.setColor (new Color(R, G, B ));					   
		      		backg.fillRect((width/100) * (xKoord-1),(height/100) * (yKoord-1) ,(width/100),(height/100));
		      		backg.setColor(Color.green);

					if (mx/6 == xKoord && my/6 == yKoord) {
						backg.drawString(" ("+mx/6+","+my/6+")   "+name ,sx,sy); //Koordinatenname
					} 
					else {
					    backg.drawString(" ("+mx/6+","+my/6+")",sx,sy); //Koordinatenname
					}
					}
			
         	}   				   			

   		public void mouseMoved( MouseEvent e ) {
      		mx = e.getX();
      		my = e.getY();
      		mx = mx+6;
      		my = my+6;
      		showStatus( "Mouse at (" + mx/6 + "," + my/6 + ")" );
      		backg.drawImage( img, 0, 0, this ); 
      			
      		if (mx > (width/100)*80) { sx = mx - (width/100)*20;} else {sx = mx;}
      		if (my < (height/100)*2) { sy = my + (width/100)*5;} else {sy = my;}
      	 
      	 	backg.setColor( Color.black );
      		for ( int i = 0; i < 100; ++i ) {
         		backg.drawLine( i * width/100, height  , i * width /100, 0 );    //Koordinatenlinien y
         		backg.drawLine( 0 ,i * height/100 , width , i * height /100 );   //Koordinatenlinien x
      		}
      		
      	   usersposition();
      		repaint();
      		e.consume();
   		}
   		
   
   		public void mouseDragged( MouseEvent e ) { }

   		public void update( Graphics g ) {
			g.drawImage( backbuffer, 0, 0, this );
   		}



   		public void paint( Graphics g ) {
        	g.drawImage( backbuffer, 0, 0, this );
    	}	
	}
```


----------



## Marco13 (18. Mrz 2007)

Hm - kapier' ich jetzt nicht. Die Ausgabe steht doch NUR in der init()-Methode, und die wird von der MouseMoved-Methode aus garnicht aufgerufen!?  ???:L  Erscheint diese Meldung die ganze Zeit, oder wirklich NUR (genau dann) wenn du die Maus bewegst?


----------



## RDav (19. Mrz 2007)

hm... da war wohl noch was im cache
jedenfalls steht da nur noch einmal



> Nicht möglich zu verbinden



es funktioniert also nicht... aber das liegt nicht am programm oder?


----------



## Marco13 (19. Mrz 2007)

Nun - über die möglichen Ursachen, warum mysql.isAccessible() "false" liefert, weißt du vermutlich besser bescheid, als ich. Falls sich das Problem als hartnäckig erweist, und du keine Lösung findest,kannst du evtl. noch gezielt DANACH im passenden Forum fragen...


----------



## RDav (19. Mrz 2007)

Danke vielmals für deine hilfe. Ich werde nach einer lösung suchen... und solange es nicht am code hier liegt, ist es nur noch halb so schwer.

Gruss RDav


----------

