Problem mit repaint() in JPanel

B

ByeBye 190166

Ich habe ein Problem mit repaint(). Ich versuche mich schon lange an einem kleinem Othello-Programm, stecke aber fest.:confused: Die nachfolgende Klasse soll das Spielbrett in einem JPanel darstellen. Dazu werden einige Grafiken geladen, die Klasse instanziiert und ein MouseAdapter hinzugefügt. Bei einem Mouseklick soll ein Spielstein gesetzt werden. Das Spielbrett ist als Array deklariert. Das Array wird in der Klasse GameBoard verwaltet. Über setStone() wird ein Stein gesetzt, über getStone() ein Spielfeld abgefragt. Das JFrame beinhaltet ausser dem JPanel für das Spielbrett noch ein weiteres JPanel für die Anzeige der Spielstände etc. Das Spielbrett wird zuerst korrekt dargestellt. Nach dem Mouseklick erhalte ich jedoch eine falsche grafische Darstellung. Da ich vermutet habe das das Problem in der falschen Verwendung von Graphics liegt, habe ich eine Zwischenvariable thisGraphics angelegt in der Graphics gespeichert werden sollte um paint() bzw. paintComponent() mit dem gleichen GraphicContext erneut aufzurufen. Doch auch das funktioniert nicht. Wo liegt der Fehler ?
Sende auch gerne den kompletten Quellcode obwohl der Fehler eigentlich in der unten angegebenen Klasse liegen müsste. Ich sehe das Problem nicht.:confused:

Code:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.Window.*;
import java.awt.Component.*;
import java.applet.*;
import java.net.*;
import java.io.*;
import javax.imageio.*;
import java.lang.String;
import java.lang.Enum;
import java.net.URL;
import javax.swing.*;
import javax.swing.border.*;
import java.lang.Object;
import java.lang.reflect.*;

// import classes.OthelloFrame;
// import classes.OthelloPlayer;

// import ConstInterface;

// import classes.GameBoard;

public class OthelloBoard extends JPanel implements ConstInterface
{   
        private String Stil = "Plastic";
        private String AbsoluteGroesse = "60";
        private String RelativeGroesse = "70%";
        private String Aussehen = "Sphere";
        private String ImagePfad = "../images/";
        
        private String GesamterPfad = ImagePfad+Aussehen+AbsoluteGroesse+"x"+AbsoluteGroesse;
        private String FilePlasticGelb = GesamterPfad+"/PlasticGelb60x60_70%.jpg";
		private String FilePlasticBlau = GesamterPfad+"/PlasticBlau60x60_70%.jpg";
		private String FilePlasticWeiss = GesamterPfad+"/PlasticWeiss60x60_70%.jpg";
		private String FilePlasticSchwarz = GesamterPfad+"/PlasticSchwarz60x60_70%.jpg";
	
		private Image PlasticBlau;
		private Image PlasticWeiss;
		private Image PlasticSchwarz;
		private Image PlasticRot;
		private Image PlasticGelb;
	

		private MouseAdapter MyMouseAdapter;
		private SoftBevelBorder SoftBorder;
	    private GameBoard Board;
    	private Graphics thisGraphics;
        
		
		public Image BitmapComponent(String fname)
   		{
   	 		Image img;
   	
     		img = getToolkit().getImage(fname);
     		MediaTracker mt = new MediaTracker(this);
 
     		mt.addImage(img, 0);
     		try 
     		{
      		 //Warten, bis das Image vollständig geladen ist,
      		 //damit getWidth() und getHeight() funktionieren
      			mt.waitForAll();
     		} catch (InterruptedException e) 
     		{
       			//nothing
     		}
     		/*
     		int width = img.getWidth(null);
     		int height = img.getHeight(null);
     		BufferedImage bimg = new BufferedImage(width,height,
                                     BufferedImage.TYPE_INT_RGB);
            */ 
     		return (img);
     		// return (bimg);
   		} // BitmapComponent

   
   	    // OthelloFrame ist von JFrame abgeleitet
		public OthelloBoard ()
		{
			System.out.println("Konstruktor OthelloBoard");
			initComponents ();
			addMouseListener (MyMouseAdapter);
		}
		

	
		
		private void initComponents ()
		{
			System.out.println("initComponents in OthelloBoard");
            // Initialisierung der Image-Dateien    
    		PlasticGelb = BitmapComponent (FilePlasticGelb);
		    PlasticBlau = BitmapComponent (FilePlasticBlau);
	        PlasticWeiss = BitmapComponent (FilePlasticWeiss);
	        PlasticSchwarz = BitmapComponent (FilePlasticSchwarz);

			MyMouseAdapter = new MyMouseAdapter();
		
			SoftBorder = new SoftBevelBorder(SoftBevelBorder.LOWERED);
		
			System.out.println("new GameBoard");
			Board = new GameBoard(8);
			
		}// initComponents
		
			
	private class MyMouseAdapter extends MouseAdapter
	{
    	public void mousePressed (MouseEvent e)
    	{
            int x = e.getX();
	        int y = e.getY();
	        int column = x / (60);
	        int row = y / (60);
	        System.out.println("mousePressed at OthelloBoard");
	        Board.setColor (row, column, EnumColor.WHITE);
	        // paintComponent (thisGraphics);
	        repaint ();
	    }
	} // MyMouseAdapter
		
		
	
		
		public void drawGrid (Graphics g)
		{
		   // Graphics2D g2d = (Graphics2D)g;	
		   // g2d.setStroke(new BasicStroke(1.5f));
		   int x = 10;
  	       int y = 10;
  	       int BoardSize = 480;
  	       int FieldSize = 480/8;     
           g.setColor(Color.black);  
                         
           for (int i =  0; i <= 8; i++)
           {
              g.drawLine (x, y+i*FieldSize, x+BoardSize, y+i*FieldSize);
              g.drawLine (x+i*FieldSize, y, x+i*FieldSize, y+BoardSize);             
  	       }
		}
		
		public void eraseGrid (Graphics g)
		{
		   // Graphics2D g2d = (Graphics2D)g;	
		   // g2d.setStroke(new BasicStroke(1.5f));
		   int x = 10;
  	       int y = 10;
  	       int BoardSize = 480;
  	       int FieldSize = 480/8;     
           g.setColor(Color.white);  
                         
           for (int i =  0; i <= 8; i++)
           {
              g.drawLine (x, y+i*FieldSize, x+BoardSize, y+i*FieldSize);
              g.drawLine (x+i*FieldSize, y, x+i*FieldSize, y+BoardSize);             
  	       }
		}
		
		
		public void drawStones (Graphics g)
		{
		   int row, column;
		
			// Arrayindex von 0..n
  	       for (row = 0; row <= 7; row++)
  	       {
  	       	  for (column = 0; column <= 7; column++)
  	       	  {
  	       	  	 
  	       	  	  // Fragt das Board
  	       	  	  ConstInterface.EnumColor a = Board.getColor (row,column);
  	       	  	  
  	       	 
  	       	  	  if (a == ConstInterface.EnumColor.WHITE)
  	       	  	  {
  	       	  	  	 System.out.println("Stone is white");
  	       	  	     g.drawImage (PlasticWeiss,10+column*60, 10+row*60, this);
  	       	  	  }
  	       	  	  
  	       	  	  if (a == ConstInterface.EnumColor.BLACK)
  	       	  	  {
  	       	  	  	 System.out.println("Stone is black");
  	       	  	     g.drawImage (PlasticSchwarz,10+column*60, 10+row*60, this);
  	       	  	  }
  	       	  	 	  
  	       	  }
  	       }
  	    
  	    }// drawStones
  	   
  	   
		public void paintComponent (Graphics g)
		{
		    System.out.println("paint in OthelloBoard");
		 
		    
		    // thisGraphics = g;
		    
		    drawGrid (g);
		    drawStones (g);    
		 
  	      
		} // paint
		
		
  
    
    // ------------------ Get und Set-Methoden -----------------
  
    public EnumColor getColor (int row, int column)
    {
    	return (Board.getColor(row,column));
    }
     
    
    public void setColor (int row, int column, EnumColor color)
    {
    	Board.setColor (row,column,color);
    	
    }
     
     
    public void changeColor (int row, int column)
    {
    	Board.changeColor (row,column);
    }   
 	  
}
 
Ok, schau es mir mal an.
Vielleicht kann ich was übernehmen.
Wenn es nicht funktioniert weiss ich dann immer noch nicht wo der Fehler liegt.
Zusatzfrage zu dem Konstruktor von BufferedImage:
Ich muss schon im voraus die Grösse Size angeben.
Wie kann ich BufferedImage auf die Grösse des zu ladenden Image (Unbekannt) setzen damit das BufferedImage die gleiche Grösse annimmt ?
 
Schon mal Danke.
Sieht jetzt so aus.
 

Anhänge

  • Board.jpg
    Board.jpg
    66,9 KB · Aufrufe: 838
Zurück