Gezeichnete Linine verschwinden

MikeL85

Mitglied
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.

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();
    }
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:
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.
 

mihe7

Top Contributor
Du musst die Verbindungen wie Deine Inseln auch im Modell haben und paintComponent zeichnet alles.

Stell Dir einfach folgendes vor: Mit Graphics zeichnest Du in Dein Fenster auf dem Bildschirm. Jetzt überdeckst Du es mit einem anderen, d. h. auf dem Bildschirm wird Dein Fenster von dem anderen übermalt. Wenn Du das andere Fenster wieder wegnimmst, was soll jetzt an der Stelle Deines Fensters angezeigt werden?

Der Fenstermanager weiß, welche Fenster neu gezeichnet werden müssen und löst entsprechende Ereignisse aus (in Win32-API dürfte das WM_PAINT sein).

Dieses Ereignis führt irgendwann zu einem Aufruf der Methode paintComponent Deiner Komponente, die diese neu auf den Bildschirm malt.

Aktuell malst Du die Inseln neu, nicht aber die Linien -> Linien fehlen.

Wenn das Fenster in der Größe unveränderlich ist, kannst Du natürlich ein Bild verwenden, dort Deine Inseln und Linien einzeichnen und in paintComponent nur noch das Bild anzeigen.
 

MikeL85

Mitglied
Danke dir für die schnelle Antwort und auch die konkrete ausführung. Der erste Post hat schon einiges gebracht. Ich packe jetzt alles in eine Liste und nach jedem repaint() erzeugt er einfach alles erneut was in der Liste enthalten ist. Dadurch kann ich das Fenster minimieren aber alle werte bleiben erhalten.
Ist evtl. nicht die eleganteste Lösung zur zeit, jedoch klappt es. Danke nochmal un sry das ich nicht alles gepostet habe.
 

MikeL85

Mitglied
Haha aber auch das hat schon gereicht. Naja da es eben für die Uni ist möchte ich sowenig code online stellen wie nur möglich um ein Problem zu beschreiben. Auf diese Art bekomme ich dann Hinweise wo was falsch läuft, aber der Code wird nicht korrigiert was ich dann eben allein Lösen möchte.
 

Neumi5694

Top Contributor
Falls du irgendwann mal hunderte von Linien (vorher lohnt sich's nicht) hast, kannst du die Grafik ja cachen.
Zeichne in ein Image rein und dann lass dieses Image in paintComponent darstellen.
Wenn sich die Panelgröße oder eine Kreisposition oder eine Linie ändert, dann muss das Image neu erstellt werden.
Für ein paar einfache Linien ist das aber ziemlicher Overkill. 2D-Operationen brauchen nicht viel Leistung.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Monokuma 2D-Grafik Imageimport durch eine gezeichnete Form ersetzen AWT, Swing, JavaFX & SWT 16
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
propra Auf einem JPanel gezeichnete Linie auswählen AWT, Swing, JavaFX & SWT 3
K Swing JPanel auf gezeichnete Fläche legen AWT, Swing, JavaFX & SWT 4
N gezeichnete Graphiken speichern und wieder anzeigen AWT, Swing, JavaFX & SWT 8
MrMilti Gezeichnete Java2D Elemente mit Events versehen AWT, Swing, JavaFX & SWT 3
D gezeichnete bilder verblassen AWT, Swing, JavaFX & SWT 10
M Gezeichnete graphic in JTabbedPanel AWT, Swing, JavaFX & SWT 2
A gezeichnete Linie verschwindet, wenn ich JMenuBar öffne AWT, Swing, JavaFX & SWT 2
M gezeichnete Punkte dynamisch verschieben mit mousedragged AWT, Swing, JavaFX & SWT 4
R eine gezeichnete graphik speichern. AWT, Swing, JavaFX & SWT 15
T JFreeChart Linine einzeichnen AWT, Swing, JavaFX & SWT 2
S AffineTranformation Bilder verschwinden von Anzeige bei Pan, Zoom AWT, Swing, JavaFX & SWT 6
D JavaFX Menu soll nicht bei jedem Click verschwinden AWT, Swing, JavaFX & SWT 8
P Scrollbalken verschwinden beim Zoomen AWT, Swing, JavaFX & SWT 4
F textarea lässt panel verschwinden AWT, Swing, JavaFX & SWT 4
B setCursor() lässt Cursor ganz verschwinden AWT, Swing, JavaFX & SWT 9
F Swing JTextfield Beispieltext soll nach Klick verschwinden AWT, Swing, JavaFX & SWT 3
K LayoutManager Wieso verschwinden Elemente? AWT, Swing, JavaFX & SWT 20
A AWT Nach dem generieren von bildern verschwinden diese wieder AWT, Swing, JavaFX & SWT 9
M Verschwinden von gezeichneten Objekten nach Fensterverkleinerung AWT, Swing, JavaFX & SWT 3
A SWT Tooltip soll nicht verschwinden, solange User mit Maus auf Control ist AWT, Swing, JavaFX & SWT 5
C AWT Buttons verschwinden, wenn Fenster Vollbild gesetzt wird AWT, Swing, JavaFX & SWT 38
T Menüacceleratoren verschwinden bei JTree AWT, Swing, JavaFX & SWT 5
N Teile des GUI verschwinden AWT, Swing, JavaFX & SWT 8
J Hintergrundbild des JFrames lässt Textboxen verschwinden? AWT, Swing, JavaFX & SWT 4
data89 Komponenten verschwinden von JPanel, wenn ich den HG selbst male - Hilfeeee AWT, Swing, JavaFX & SWT 16
U SWT Linien verschwinden nach Verschieben AWT, Swing, JavaFX & SWT 3
G Hilfe Meine JPanels verschwinden im Müll AWT, Swing, JavaFX & SWT 10
G JTabbedPane verschwinden einfach bei Paelaktualisierung AWT, Swing, JavaFX & SWT 7
D SWING AWT - Komponenten komplett verschwinden lassen AWT, Swing, JavaFX & SWT 6
A Icons von Kontextmenüeinträgen verschwinden (SWT) AWT, Swing, JavaFX & SWT 2
K JSpinner Werte verschwinden bei Panel Wechsel AWT, Swing, JavaFX & SWT 2
G JPanel verschwinden lassen, aber wie? AWT, Swing, JavaFX & SWT 3
T Problem mit Image, restliche Elemente der Gui verschwinden AWT, Swing, JavaFX & SWT 9
B NULL Layout - TextFelder verschwinden AWT, Swing, JavaFX & SWT 8
G JTabbedPane: Tabs verschwinden lassen ? AWT, Swing, JavaFX & SWT 10
X Verschwinden des JMenu unterbinden AWT, Swing, JavaFX & SWT 3
L Labels verschwinden! AWT, Swing, JavaFX & SWT 10
G JTabbedPane: Tabs verschwinden lassen und wieder anzeigen AWT, Swing, JavaFX & SWT 3
juppi JFrame will nicht wieder verschwinden AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben