C
CMGbR
Gast
Hallo zusammen,
ich arbeite gerade für mein Studium an der grafischen Oberfläche für Schiffe-Versenken.
Genauer gesagt an den Schiffen selbst. Ich habe dafür einen neue Klasse Ship geschrieben, die von JPanel erbt.
Man übergibt dem Konstuktor die Größe des Schiffs (Anzahl der Felder), Variation (es gibt 3 verschiedene grafikvariationen), Feldgröße und Richtung (true = vertikal)...
Den Code für die Ship-Klasse habe ich der Übersicht halber ganz unten angehängt.
Der Konstruktor initialisiert nur die Variablen, setzt die Hintergrundfarbe und ruft dann buildShipGraphics() auf, welche dann die Größe und das Layout festlegt und dann addTile aufruft.
AddTile holt sich die Grafiken für die Schiffe und fügt die JLabels mit den entsprechenden Icons ein. Jedes Schiff besteht aus einem Anfangsstück, beliebig vielen Mittelstücken und einem Endstück.
Ich kann in meinem Frame problemlos ein neues Schiff anlegen:
Das funktioniert sowohl vertikal als auch horizontal und in jeder Größe.
Dann habe ich eine weitere Methode zum Schiff hinzugefügt: rotateShip();
rotateShip soll alle Tiles (also die Labels) löschen, den Wert von direction ändern und dann wieder buildShipGraphics() aufrufen.
Das funktioniert aber nicht! Sobald ich die Methode rotate() aufrufe verschwindet das ganze Schiff vom Bildschirm. Es taucht auch nicht wieder auf wenn ich zurückrotiere.
Ich hab schon an allen möglichen Stellen Kombinationen aus
invalidate() & validate()
revalidate()
repaint()
updateUI()
usw. versucht.
Das Hilft alles nichts...
Kann mir jemand helfen?
Vielen Dank im Voraus und viele Grüße
Kornelius
ich arbeite gerade für mein Studium an der grafischen Oberfläche für Schiffe-Versenken.
Genauer gesagt an den Schiffen selbst. Ich habe dafür einen neue Klasse Ship geschrieben, die von JPanel erbt.
Man übergibt dem Konstuktor die Größe des Schiffs (Anzahl der Felder), Variation (es gibt 3 verschiedene grafikvariationen), Feldgröße und Richtung (true = vertikal)...
Den Code für die Ship-Klasse habe ich der Übersicht halber ganz unten angehängt.
Der Konstruktor initialisiert nur die Variablen, setzt die Hintergrundfarbe und ruft dann buildShipGraphics() auf, welche dann die Größe und das Layout festlegt und dann addTile aufruft.
AddTile holt sich die Grafiken für die Schiffe und fügt die JLabels mit den entsprechenden Icons ein. Jedes Schiff besteht aus einem Anfangsstück, beliebig vielen Mittelstücken und einem Endstück.
Ich kann in meinem Frame problemlos ein neues Schiff anlegen:
Java:
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
newship = new ship(10,1,30,true);
newship.setLocation(0,0);
add(newship);
newship.setVisible(true);
pack();
}
Das funktioniert sowohl vertikal als auch horizontal und in jeder Größe.
Dann habe ich eine weitere Methode zum Schiff hinzugefügt: rotateShip();
rotateShip soll alle Tiles (also die Labels) löschen, den Wert von direction ändern und dann wieder buildShipGraphics() aufrufen.
Das funktioniert aber nicht! Sobald ich die Methode rotate() aufrufe verschwindet das ganze Schiff vom Bildschirm. Es taucht auch nicht wieder auf wenn ich zurückrotiere.
Ich hab schon an allen möglichen Stellen Kombinationen aus
invalidate() & validate()
revalidate()
repaint()
updateUI()
usw. versucht.
Das Hilft alles nichts...
Kann mir jemand helfen?
Vielen Dank im Voraus und viele Grüße
Kornelius
Java:
public class ship extends JPanel {
int variation, length, fieldsize;
boolean direction;
/** Creates new form BeanForm */
public ship(int length, int variation, int fieldsize, boolean direction) {
super();
this.length=length;
this.variation=variation;
this.fieldsize=fieldsize;
this.direction=direction;
this.setBackground(new Color(255,255,255,0));
buildShipGraphics();
}
public void buildShipGraphics() //Setzt die Größe des Schiffs (vertikal oder horizontal) und fügt die Labels ein
{
int i;
if(direction)
{
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
setSize(fieldsize,fieldsize*length);
setPreferredSize( new Dimension(fieldsize, fieldsize*length) );
addTile(0,true,0,0,fieldsize);
for(i=1;i<length-1;i++)
{
addTile(1,true,0,fieldsize*i,fieldsize);
}
addTile(2,true,0,fieldsize*(i+1),fieldsize);
}
else
{
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
setSize(fieldsize*length,fieldsize);
setPreferredSize( new Dimension(fieldsize*length, fieldsize) );
addTile(0,false,0,0,fieldsize);
for(i=1;i<length-1;i++)
{
addTile(1,false,fieldsize*i,0,fieldsize);
}
addTile(2,false,fieldsize*(i+1),0,fieldsize);
}
}
//posX und posY werden seit dem BoxLayout nicht mehr verwendet:
private void addTile(int type, boolean vertical, int posX, int posY, int size)
{
String dir = (vertical ? "v" : "h");
ImageIcon icon = new ImageIcon(getClass().getResource("images/ship_"+Integer.toString(this.variation)+"_" + dir + "_"+Integer.toString(type)+".png").getPath() );
JLabel temp = new JLabel(scaleTileIcon(icon,fieldsize));
//temp.setLocation(posX,posY);
temp.setSize(size,size);
temp.setPreferredSize(new Dimension(size,size));
//temp.setIconTextGap(0);
temp.setBackground(new Color(255,255,255,0));
this.add(temp);
temp.setVisible(true);
temp.validate();
}
private ImageIcon scaleTileIcon(ImageIcon icon, int size)
{
BufferedImage bi = new BufferedImage(size,size, BufferedImage.TYPE_INT_ARGB);
bi.getGraphics().drawImage(icon.getImage(), 0, 0, size, size, null);
return new ImageIcon(bi);
}
public void rotateShip()
{
this.removeAll();
direction=(direction?false:true);
//this.removeAll();
System.out.println(direction);
//direction=false;
buildShipGraphics();
this.validate();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
setName("ship"); // NOI18N
setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS));
}// </editor-fold>
// Variables declaration - do not modify
// End of variables declaration
}
Zuletzt bearbeitet von einem Moderator: