2016-04-11 19 views
0

Ich versuche, eine Farbe-Software zu erstellen, aber am Ende mit dem Problem der verschwinden Grafiken.Java - Zeichnung verschwindet beim Minimieren von JFrame

Meine Klasse ist wie folgt:

public class CanvasFrame extends JPanel { 

    private Point lastMousePoint; 
    ArrayList<Point> location = new ArrayList<Point>(); 


    public CanvasFrame() { 


     addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       lastMousePoint = new Point (e.getX(), e.getY()); 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseDragged(MouseEvent e) { 
       Graphics g = getGraphics(); 
       g.drawLine(lastMousePoint.x, lastMousePoint.y, e.getX(), e.getY()); 
       lastMousePoint = new Point(e.getX(), e.getY()); 
       g.dispose(); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Drawing with friends"); 
     frame.getContentPane().add(new CanvasFrame(), BorderLayout.CENTER); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(800, 600); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(false); 
     frame.setVisible(true); 
    } 
} 

Die Zeichnung Teil der Software funktioniert prima, aber wie die Ausgabe informiert, die Zeichnung verschwindet auf minimiert wird.

Ich habe versucht, umgehen mit Override Graphics g, sowie das Speichern aller Mauspunkte in einem Array, aber ohne Glück. In meiner Umgebung konnte ich keine Lösung für mein genaues Projekt finden, also hoffe ich, dass ihr helfen könnt.

+0

Wo Sie die Methode paintcomponent mit Zeichencode außer Kraft setzen kann? Ihre mouseDragged-Methode sollte die Punkte in einer Liste speichern, damit die paintComponent-Methode die Punkte aus der Liste ziehen kann. –

Antwort

0

Ich habe Ihren Code so angepasst, dass Sie eine Linie zeichnen, solange Sie die Maus ziehen. Sie zeichnen eine neue Linie, wenn Sie loslassen und drücken Sie die linke Maustaste erneut.

Drawing With Friends

Hier sind die Änderungen, die ich an den Code vorgenommen.

  1. Ich wickelte den JFrame-Code in einem Runnable, und berief sich auf die Swing-GUI mit einem Aufruf der Methode SwingUtilities invokeLater. Die invokeLater-Methode legt die Erstellung und Aktualisierung der Swing-GUI-Komponenten auf Event Dispatch thread fest. Oracle und ich verlangen, dass jeder seine Swing-Anwendung auf dem Event Dispatch-Thread startet.

  2. Ich habe die paintComponent-Methode hinzugefügt, um die Punkte in der Standortliste zu zeichnen.

  3. Ich habe die Mausmethoden geändert, um Punkte zum Standort Liste hinzuzufügen.

  4. Ich habe die Größeninformationen vom JFrame zum JPanel verschoben. Die Größe des JFrames ist uns egal. Wir kümmern uns um die Größe der Zeichenfläche.

Hier ist der Code:

package com.ggl.testing; 

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class CanvasFrame extends JPanel { 

    private static final long serialVersionUID = -2454929744982913302L; 

    private List<Point> location = new ArrayList<Point>(); 

    public CanvasFrame() { 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       location.clear(); 
       location.add(e.getPoint()); 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       location.add(e.getPoint()); 
       repaint(); 
      } 
     }); 

     setPreferredSize(new Dimension(800, 600)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     if (location.size() <= 0) { 
      return; 
     } 

     Point p = location.get(0); 
     for (int i = 1; i < location.size(); i++) { 
      Point q = location.get(i); 
      g.drawLine(p.x, p.y, q.x, q.y); 
      p = q; 
     } 
    } 

    public static void main(String[] args) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame("Drawing with friends"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new CanvasFrame(), BorderLayout.CENTER); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }; 
     SwingUtilities.invokeLater(runnable); 
    } 
} 
+0

Danke für die Antwort! Es wird nicht mehr zurückgesetzt, aber ich wollte nicht, dass die vorherige Zeile entfernt wird, wenn eine neue gezeichnet wird. Also entfernte ich das klare(); Methode. Es löscht nicht mehr, sondern verbindet die Linien, die ich zeichne, wo ich sie trennen möchte. Irgendwelche Vorschläge, um das zu beheben? – WONDERGG

+0

@WONDERGG: Sie benötigen eine Liste mit Punktelisten, eine Liste mit Punkten für jede Zeile. Sie können auch eine Java-Datenklasse namens CanvasLIne erstellen, die eine Liste von Punkten enthält. Dann hätten Sie eine Liste von CanvasLine-Objekten. –