Neuzeichnen vom Panel zu langsam ?



  • Hallo.

    Ich habe ein etwas größere Application, mit der es möglich ist 3 und 4 gewinnt zu spielen. Ich habe das Spielfeld in einzelene Pannels aufgeteilt(jeweils ein Feld).

    Nun besitzt jedes Feld (bzw Panel) eine paint funktion , die je nach wert einen kreis darstellt (mit farbe von spieler 1 oder 2) ansonsten bleibt das feld in normalen farbe.

    bei 3 gewinnt funktioniert dsa auch super. man klickt auf ein feld und der wert wird dargestellt. nur bei 4 gewinnt (7x6 felder) stimmt das nicht. man klickt und es passiert nichts. allerdings wird das feld aktualisert wenn man das fenster minimiert und wieder darstellt.

    hier ist der code :

    public void paintComponent(Graphics g){
    		super.paintComponent( g );	
    
    		if (activeField == true){	
    			System.out.println(parentGui.game.playingField.getFieldValue(new Point(fieldX, fieldY)));
    			if (parentGui.game.playingField.getFieldValue(new Point(fieldX, fieldY)) != PlayerColor.NoPlayer){				
    
    				if (parentGui.game.playingField.getFieldValue(new Point(fieldX, fieldY)) == PlayerColor.Player1){					
    					g.setColor(parentGui.defaultPlayer1Color);
    				}else{				
    					if (parentGui.game.playingField.getFieldValue(new Point(fieldX, fieldY)) == PlayerColor.Player2){
    						g.setColor(parentGui.defaultPlayer2Color);
    					}
    				}
    
    				int maxDistance = 4;
    				int fieldSize 	= Math.min(this.getSize().height, this.getSize().width) - maxDistance;				
    				int startHeight	= (this.getSize().height - fieldSize) / 2;
    				int startWidth	= (this.getSize().width - fieldSize) / 2;				
    				g.fillArc(startWidth,startHeight, fieldSize, fieldSize, 0,360);
    			}		
    		}		
    	}
    
    	@Override
    	public void mouseClicked(MouseEvent e) {
    		if (this.activeField == true){
    
    			if (parentGui.game.player1.getPlayerState() == PlayerState.Active){
    				if (parentGui.game.playingField.setFieldValue(new Point(fieldX, fieldY), parentGui.game.player1.getPlayerColor()) == true){
    					parentGui.game.changePlayerState();
    					try {
    						Thread.sleep(1000);
    					} catch (InterruptedException e1) {
    						// TODO Auto-generated catch block
    						e1.printStackTrace();
    					}
    					this.repaint();					
    				}
    			}else{
    				if (parentGui.game.player2.getPlayerState() == PlayerState.Active){
    					if (parentGui.game.playingField.setFieldValue(new Point(fieldX, fieldY), parentGui.game.player2.getPlayerColor()) == true){						
    						parentGui.game.changePlayerState();				
    						this.repaint();					
    					}
    				}
    			}			
    		}		
    	}
    

    Kann mir das jemand erklären ??

    Vielen Dank



  • Was soll das: Thread.sleep(1000); in mouseClicked ?

    Im übrigen hat dein Code auch sonst ganz schön arge Fehler, ob die was mit deinem Problem zu tun haben kann ich nicht erkennen, aber ich liste sie trotzdem mal auf:
    - Im ganzen Code: Direkter Zugriff auf mysteriöses 'parentGui.game.playingField', mach deine Variablen mal private
    - in paintComponent: 3 mal Zugriff auf getFieldValue und 4 mal Zugriff auf getSize() (und dann nur um auf die einzelnen Dimensionen zuzugreifen)
    - in mouseClicked die gleichen Probleme
    - außerdem: Spiellogik in mouseClicked



  • Das mit dem Thread.sllep war nur ein Test und ist uinzwischen auch schon wieder draußen.

    parentGui ist das Main Frame. Hier gibt es ein Panel was wiederum einzelene Panels enthält : die Felder des Spielfeldes. Das MAin Frame besitzt eine Insatnu der Klasse Game, die die Logik des Spiels übernimmt.

    Der mehrfache Zugriff auf die getFieldSiez werde ich mal vereinfachen.
    Allerdings ist das kein Grund warum es so langsam ist.



  • Fischkopf2009 schrieb:

    parentGui ist das Main Frame. Hier gibt es ein Panel was wiederum einzelene Panels enthält : die Felder des Spielfeldes. Das MAin Frame besitzt eine Insatnu der Klasse Game, die die Logik des Spiels übernimmt.

    Sowas hab ich mir schon gedacht, daher sagte ich ja: mach deine eigenschaften im MainFrame private und trenne erstmal die Ansicht von deiner Spiellogik

    Der mehrfache Zugriff auf die getFieldSiez werde ich mal vereinfachen.
    Allerdings ist das kein Grund warum es so langsam ist.

    Kann man nicht sagen, schließlich weiß niemand wie get und setFieldSize bei dir implementiert ist..


Anmelden zum Antworten