Hallo zusammen,
ich bin neu in diesem FOrum und habe google schon nach den Problem abgesucht und auch bereits in diesem Forum nach einer Lösung gesucht. Jedoch keine Lösung gefunden die auf mein Problem passt.
Da es sich hier um eine Uni Aufgabe handelt, möchte ich nicht den gesamten Code Online stellen und bitte daher um verständnis.
Zu meiner Problembeschreibung:
Ich erstelle eine JFrame mit Menüleiste und Buttons. Im Center platziere ich ein JPanel was als Spielfeld dienen soll.
Über getter und Setter kann ich das Panel ansprechen.
Nachdem der Spieler auf neues Spiel klickte öffnet sich ein JDialog über dem er alle Einstellungen vornehmen kann. Nach Bestätigung der Eingabe findet eine intensive Berechnung statt je nach Einstellung kann diese etwas dauern.
Folgender Code nach Bestätigung wird ausgeführt.
Creator berechnet nun die Inseln, die auf dem Spielfeld platziert werden sollen und zeichnet diese anschließen in der Methode:
Soweit so gut. Das läuft alles auch. Die Inseln werden auf dem Panel gezeichnet und auch wenn ich das Fenster Minimiere bleiben sie vorhanden.
Wenn der Spieler jetzt auf eine Insel klickt soll diese mit einer benachbarten Insel verbunden werden. Auch dieses ist schon alles Implementiert und auch diese Linien werden gezeichnet.
Das Problem ist jetzt jedoch. Minimiere ich das Fenster verschwinden die Linien die gezeichnet wurden und auch der Counter wird runtergesetzt.
Beides Dinge die ich jedoch nicht möchte.
Das zeichen der Linien wird in einer weiteren Klassen erzeugt DrawBridges.java. Der Konstruktor verlangt ein JPanel als Parameter.
In dieser Klasse wird auch der MouseClicked abgefragt.
Setzte ich hier ***panel.repaint() rein setzt der die Counter runter aber es wird keine Linie gezeichnet.
calculateIsland ermittel die jeweilige Insel auf dem Feld und ruft dann eine Methode auf die eine linie in diese Richtung zeichnet.
Beispiel:
setDoubleBridge ruft nun diese Methode auf
Die letzte Klasse die jetzt noch aufgerufen wird ist CreateBridges... mit der Methode
Die Klasse DrawBridges wird jetzt am ende des Konstruktors von Creator aufgerufen.
Ich weiss es schaut alles sehr Chaotisch aus und kann auch nicht den ganzen code posten von den jeweiligen Methoden. Daher versuche ich es so zu schreiben das ihr einen Einblick bekommt wo passiert was.
ich bin neu in diesem FOrum und habe google schon nach den Problem abgesucht und auch bereits in diesem Forum nach einer Lösung gesucht. Jedoch keine Lösung gefunden die auf mein Problem passt.
Da es sich hier um eine Uni Aufgabe handelt, möchte ich nicht den gesamten Code Online stellen und bitte daher um verständnis.
Zu meiner Problembeschreibung:
Ich erstelle eine JFrame mit Menüleiste und Buttons. Im Center platziere ich ein JPanel was als Spielfeld dienen soll.
Java:
Combine.add(drawPanel, BorderLayout.CENTER);
drawPanel.setLayout(new BorderLayout(0, 0));
Über getter und Setter kann ich das Panel ansprechen.
Nachdem der Spieler auf neues Spiel klickte öffnet sich ein JDialog über dem er alle Einstellungen vornehmen kann. Nach Bestätigung der Eingabe findet eine intensive Berechnung statt je nach Einstellung kann diese etwas dauern.
Folgender Code nach Bestätigung wird ausgeführt.
Java:
mainView.getDrawPanel().removeAll();
create = new Creator(puzzleDialog.getGridHeight(), puzzleDialog.getGridWidth(),
puzzleDialog.getIslands(), puzzleDialog.getSizeX(), puzzleDialog.getSizeY());
create.setBackground(Color.WHITE);
mainView.getDrawPanel().add(create, BorderLayout.CENTER);
mainView.getDrawPanel().revalidate();
mainView.getDrawPanel().repaint();
Creator berechnet nun die Inseln, die auf dem Spielfeld platziert werden sollen und zeichnet diese anschließen in der Methode:
Java:
public void paintComponent(Graphics g) {
super.paintComponent(g); //
for (int i = 0; i < islandCount; i++) {
g.drawString(Integer.toString(i), listIslands.get(i).getCoordX(), listIslands.get(i).getCoordY());
g.drawString(Integer.toString(listIslands.get(i).getBridgeCounter()), listIslands.get(i).getCoordX() + 15,
listIslands.get(i).getCoordY() + 15);
drawCircle(g, listIslands.get(i).getCoordX(), listIslands.get(i).getCoordY(), 15);
}
}
Soweit so gut. Das läuft alles auch. Die Inseln werden auf dem Panel gezeichnet und auch wenn ich das Fenster Minimiere bleiben sie vorhanden.
Wenn der Spieler jetzt auf eine Insel klickt soll diese mit einer benachbarten Insel verbunden werden. Auch dieses ist schon alles Implementiert und auch diese Linien werden gezeichnet.
Das Problem ist jetzt jedoch. Minimiere ich das Fenster verschwinden die Linien die gezeichnet wurden und auch der Counter wird runtergesetzt.
Beides Dinge die ich jedoch nicht möchte.
Das zeichen der Linien wird in einer weiteren Klassen erzeugt DrawBridges.java. Der Konstruktor verlangt ein JPanel als Parameter.
In dieser Klasse wird auch der MouseClicked abgefragt.
Java:
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
System.out.println("Left was hit");
setxFirst(e.getX());
setyFirst(e.getY());
calculateIsland(e.getX(), e.getY());
****
}
if (e.getButton() == MouseEvent.BUTTON3) {
right = true;
setxFirst(e.getX());
setyFirst(e.getY());
calculateIsland(e.getX(), e.getY());
right = false;
}
islands = Creator.getListIslands();
}
calculateIsland ermittel die jeweilige Insel auf dem Feld und ruft dann eine Methode auf die eine linie in diese Richtung zeichnet.
Beispiel:
Java:
if (listOfbridges.get(i).getBridgeAmount() == 1) {
// Sets two bridges for the island
setDoubleBridge(firstX, firstY, indexOfIsland, j);
// Set the counter for the double bridge to two.
listOfbridges.get(i).setBridgeAmount(2);
System.out.println(listOfbridges + " zwei Brücken");
checkIslands(indexOfIsland, j);
return;
}
setDoubleBridge ruft nun diese Methode auf
Java:
public void drawBridge(int x1, int y1, int x2, int y2, int firstID, int secondID) {
Graphics2D g = (Graphics2D) panel.getGraphics();
drawnBridges = new CreateBridges(x1, y1, firstID, x2, y2, secondID, linelist, g);
drawnBridges.setDrawnBridges(drawnBridges, linelist);
System.out.println(drawnBridges.toString());
System.out.println(linelist.toString());
}
Die letzte Klasse die jetzt noch aufgerufen wird ist CreateBridges... mit der Methode
Java:
public void drawBridge(Graphics2D g) {
g.setStroke(stroke);
if(drawnBridges.isEmpty()) {
g.setColor(Color.BLUE);
g.drawLine(getFirstX(), getFirstY(), getSecondX(), getSecondY());
} else if(!drawnBridges.isEmpty()) {
g.setColor(Color.BLACK);
g.drawLine(drawnBridges.get(drawnBridges.size()-1).getFirstX(),drawnBridges.get(drawnBridges.size()-1).getFirstY(),
drawnBridges.get(drawnBridges.size()-1).getSecondX(), drawnBridges.get(drawnBridges.size()-1).getSecondY());
g.setColor(Color.BLUE);
g.drawLine(firstX, firstY, secondX, secondY);
}
}
Die Klasse DrawBridges wird jetzt am ende des Konstruktors von Creator aufgerufen.
Java:
this.drawBridges = new DrawBridges(this);
//addMouseMotionListener(drawBridges);
addMouseListener(drawBridges);
Ich weiss es schaut alles sehr Chaotisch aus und kann auch nicht den ganzen code posten von den jeweiligen Methoden. Daher versuche ich es so zu schreiben das ihr einen Einblick bekommt wo passiert was.