2011-09-09 3 views
3

J'ai besoin d'aide avec un programme simple. Je voudrais, quand je clique sur le programme le marque. J'aimerais voir mes mouvements passés. Comme un crayon dans la peinture.Comment ne pas repeindre JFrame? Il suffit de peindre

classe Test.java

import java.awt.*; 
import java.awt.event.*; 
import java.util.Scanner; 
import java.io.IOException; 
import java.lang.*; 
import javax.swing.*; 

public class Test{ 

    JFrame frame; 

    public static void main(String[] args){ 
     Test smallTest = new Test(); 
     smallTest.letsDoIt(); 
    } 

    public void letsDoIt(){ 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JButton buttonOfTheEnd = new JButton("EXIT"); 
     buttonOfTheEnd.addActionListener(new theEndListener()); 

     graphPanel panelR = new graphPanel(); 
     panelR.setBackground(Color.WHITE); 
     frame.getContentPane().add(BorderLayout.CENTER, panelR); 
     frame.getContentPane().add(BorderLayout.SOUTH, buttonOfTheEnd); 
     frame.setSize(500,500); 
     frame.setVisible(true); 


     frame.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 

       frameMouseClicked(evt); 

      } 
     }); 

    } 

    void frameMouseClicked(java.awt.event.MouseEvent evt) { 


     System.out.println("("+MouseInfo.getPointerInfo().getLocation().x+", "+MouseInfo.getPointerInfo().getLocation().y+")"); 
     frame.repaint(); 

    } 

    class theEndListener implements ActionListener { 
     public void actionPerformed(ActionEvent zdarzenie){ 
      System.exit(0); 
     } 
    } 


    // public void paintComponent(Graphics g){ 
     // super.paintComponent(g); 
     // int wspX = MouseInfo.getPointerInfo().getLocation().x; 
     // int wspY = MouseInfo.getPointerInfo().getLocation().y; 

     // g.setColor(Color.RED); 
     // g.fillRect(wspX, wspY, 10, 10); 

    // 




} 

classe graphPanel

import java.awt.*; 
import javax.swing.*; 

class graphPanel extends JPanel{ 


    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 


     int locX = MouseInfo.getPointerInfo().getLocation().x - 10; 
     int locY = MouseInfo.getPointerInfo().getLocation().y - 30; 
     g.setColor(Color.ORANGE); 
     g.fillRect(locX, locY, 10, 10); 
     } 
} 

grâce à l'aide.

+0

S'il vous plaît [accepter] (http://meta.stackexchange.com/questions/16721/how-does- accept-rate-work/65088 # 65088) quelques réponses! –

Répondre

2

Essayez de peindre sur une image de votre graphPanel et de peindre l'image sur le composant.
Si vous ne supprimez pas l'image, vous joignez tous les dessins.

class graphPanel extends JPanel{ 
    Image img; 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     if(img == null) { 
      img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_3BYTE_BGR); 
      img.getGraphics().setColor(getBackground()); 
      img.getGraphics().fillRect(0, 0, getWidth(), getHeight()); 
     } 
     int locX = MouseInfo.getPointerInfo().getLocation().x - 10; 
     int locY = MouseInfo.getPointerInfo().getLocation().y - 30; 
     Graphics imgG = img.getGraphics(); 
     imgG.setColor(Color.ORANGE); 
     imgG.fillRect(locX, locY, 10, 10); 
     g.drawImage(img, 0, 0, this); 
    } 
} 
+0

1) Utilisez 'this' pour' ImageObserver'. 2) Le composant ne peut être redimensionné que si la largeur et la hauteur de l'image ont été vérifiées par rapport au composant WxH dans la vérification 'if (img == null)'. –

2

Vous devez stocker les emplacements récents quelque part. Un List est un bon choix. Maintenant, lorsque vous cliquez quelque part sur l'écran, vous ajoutez l'emplacement à la liste et lorsque vous avez besoin de repeindre l'écran, vous peignez tous les emplacements stockés. C'est quelque chose comme séparant le modèle et la vue (le modèle est votre liste d'emplacements 2D, le voir est ce que vous peignez sur l'écran).

donc créer une liste quelque part:

// public static only to keep it simple!! 
public static List<Point> points = new ArrayList<Point>(); 

Puis (merci, oliholz!) Ajouter l'auditeur à panelR au lieu de frame:

panelR.addMouseListener(new MouseAdapter() { 
    // ... 

et écrire frameMouseClicked comme:

void frameMouseClicked(MouseEvent evt) { 
    points.add(evt.getPoint()); 
    frame.repaint(); 
} 

Intérieur paintComponent ans u itérer la liste et tous les emplacements mémorisés dessiner (nouveau: très simple et réduit, improveable)

g.setColor(Color.ORANGE); 
for (Point point:points) { // <- this is the list of stored points 
    g.fillRect(point.x, point.y, 10, 10); 
} 
+0

vos points ont un décalage de frame à graphPanel – oliholz

+1

utilisez 'points.add (evt.getPoint());' et ajoutez le 'MouseListener' à' panelR' – oliholz

+0

@oliholz ​​- merci! –

Questions connexes