Graphics2d wir vom BackGround übermalt

Victim De Ace

Grünschnabel
Hi ich wollte mal schiffe versenken mit Java programmieren und bin da nun auf ein Problem gestoßen das ich nicht lösen kann es geht darum:
Ich habe um es testen zu können ein schiff in meinem feld fest plaziert und nachdem ich das schiff mit graphics2D gedreht habe wird dieses immer wieder vom Background übermalt.
Hier einmal den Quellcode von meiner Klasse: "Zelle"
/*
* Zelle.java
*
* Created on 6. April 2006, 10:26
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package battleships;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.io.*;


/**
*
* @author Victim De Ace
*/
public class Zelle extends JComponent {

public static final byte wasser = 0;
public static final byte treffer = 1;
public static final byte daneben = 2;
public static final byte Schiff = 4;
public static final byte aufgedeckt = 8;
public static final byte own_part = 16;

public static final int SHIP_NOT_THERE = -1;
public static final int SHIP_PART_1 = 0;
public static final int SHIP_PART_2 = 1;
public static final int SHIP_PART_3 = 2;
public static final int SHIP_PART_4 = 3;
public static final int SHIP_PART_5 = 4;

public static final int ORI_NORTH = 0;
public static final int ORI_EAST = 90;
public static final int ORI_SOUTH = 180;
public static final int ORI_WEST = 270;

private byte status;
private int ship_part;
private int ori = ORI_WEST;


/** Creates a new instance of Zelle */
public Zelle(){
this(wasser, SHIP_NOT_THERE);
}

public Zelle(byte status, int ship_part) {
this.status = status;
this.ship_part = ship_part;
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt){
if (evt.getButton() == MouseEvent.BUTTON1) {
clickeit(evt);
}
repaint();
}
});

}

public void setStatus(byte value) { status = value; repaint(); }

public byte getStatus() { return status; }

public void addStatus(byte value) {
if (!((status & value) == value)) status += value;
repaint();
}

public void subStatus(byte value) {
if ((status & value) == value) status -= value;
repaint();
}

public void setShipPart(int value) {
ship_part = value;
repaint();
}

public int getShipPart() {
return ship_part;
}

private void clickeit(MouseEvent evt) {
if (((status & treffer) == treffer) || ((status & daneben) == daneben)) return;
else if ((status & Schiff) == Schiff) status += treffer;
else status += daneben;
}

private Image getImage(String pth) {
return (new ImageIcon(getClass().getResource(pth))).getImage();
}

private Image drawShip() {
/* switch (ship_part) {
case SHIP_PART_1:
g.drawImage(getImage("ship_part1.gif"), 0, 0, null);
break;
case SHIP_PART_2:
g.drawImage(getImage("ship_part2.gif"), 0, 0, null);
break;
case SHIP_PART_3:
g.drawImage(getImage("ship_part3.gif"), 0, 0, null);
break;
case SHIP_PART_4:
g.drawImage(getImage("ship_part4.gif"), 0, 0, null);
break;
case SHIP_PART_5:
g.drawImage(getImage("ship_part5.gif"), 0, 0, null);
break;

}*/
switch (ship_part) {
case SHIP_PART_1:return getImage("ship_part1.gif");

case SHIP_PART_2: return getImage("ship_part2.gif");

case SHIP_PART_3:return getImage("ship_part3.gif");

case SHIP_PART_4:return getImage("ship_part4.gif");

case SHIP_PART_5: return getImage("ship_part5.gif");
default: return null;

}
}

protected void paintComponent(Graphics g){


/* if (clicked) {
g.drawImage(getImage("Wasser.gif"),0,0,null);
} else {
g.setColor(Color.cyan);
g.fillRect(0, 0, getSize().width, getSize().height);
}*/
// byte clicked = default;
//super.paintComponent(g);
if ((status & daneben) == daneben) /*= daneben*/ {
g.drawImage(getImage("wasser.gif"),0,0,null);
} else if (((status & treffer) == treffer) && (!((status & aufgedeckt) == aufgedeckt)) && (!((status & own_part) == own_part))) {
g.drawImage(getImage("treffer.gif"), 0, 0, null);
} else if ((((status & aufgedeckt) == aufgedeckt) || ((status & own_part) == own_part)) && (ship_part != SHIP_NOT_THERE)) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
AffineTransform at = AffineTransform.getRotateInstance(ori * Math.PI / 180, (25)/2, (25)/2);
g2.setTransform(at);
g2.drawImage(drawShip(),1 ,1,23, 23,null);
} else {
/* g.setColor(Color.cyan);
g.fillRect(0, 0, getSize().width, getSize().height);*/
g.drawImage (getImage("Wasser1.gif"),0,0,null);
}

}
//super.paintComponent(g);

public static void main(String[] args) {
int b = 1;
b += 5;
System.out.println("b := "+b);
}
}
// }
Danke schonmal im vorraus
 
Ich würde das ganze sowieso etwas anders machen, indem ich mir eine Klasse schreibe die von JLable erbt und der im Konstruktor ein Image übergeben wird, dann kümmert sich das Lable um das zeichnen(bei überschreibung der paintComponent oder paint methode..)
und das mit dem setOpaque() solltest du mal bei deinem Graphics Object versuchen..

//edit

Ok habe gerade festgestellt das es die Methode setOpaue() nicht für das Graphics Object gibt, ich würde dir trotzdem vorschlagen es mit dem Lable zu versuchen, ansonsten wenn du das nicht möchtest, zeiche doch erst den Hintergrund und dann das Schiff, im moment machst du es genau anderherum...
 
Zuletzt bearbeitet:
ja danke für die Hilfe ich habe mir so weiter geholfen:
In meiner Klasse SpielFeld habe ich ja ein schiff (nur um zu wissen ob es funktioniert).
Dieses Schiff tauchte dann später ja auch auf, doch nachdem ich es mit Graphics2D gedreht habe verschwand es bzw. der Hintergrund schiebte sich davor.

Ich löste dieses Problem recht elegant, indem ich in dieser Klasse am ende
super.paintComponents(g); und sieh an es funktionierte.

trotzdem nochmals Danke für die Hilfe
 
Zurück