2010-10-10 16 views
2

Impossible de comprendre comment afficher un seul cercle. Essayait de //g.clearRect(0, 0, 400, 400); mais cela efface l'arrière-plan aussi. Était également en train d'essayer de simplement remplir l'arrière-plan avec du jaune à nouveau, mais ne pouvait pas obtenir ce travail non plus. Aucune suggestion?Écran peint clair à chaque clic de la souris?

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

public class JMouseFrame extends JFrame 
     implements MouseListener { 

    Container con = null; 
    int x, y; 
    int size; 

    public JMouseFrame() { 
     setTitle("JMouseFrame"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     con = this.getContentPane(); 
     addMouseListener(this); 
    } 

    public void mousePressed(MouseEvent e) { 
     x = e.getX(); 
     y = e.getY(); 
    } 

    public void mouseClicked(MouseEvent e) { 
     int whichButton = e.getButton(); 
     if (whichButton == MouseEvent.BUTTON1) { 
      size = 15; 
     } else if (whichButton == MouseEvent.BUTTON3) { 
      size = 4; 
     } 
     repaint(); 
    } 

    public void mouseEntered(MouseEvent e) { 
     con.setBackground(Color.yellow); 
    } 

    public void mouseExited(MouseEvent e) { 
     con.setBackground(Color.black); 
    } 

    public void paint(Graphics g) { 
     //g.clearRect(0, 0, 400, 400); 
     g.drawOval(x - size, y - size, size * 3, size * 3); 
    } 

    public static void main(String[] args) { 
     JMouseFrame mFrame = new JMouseFrame(); 
     mFrame.setSize(400, 400); 
     mFrame.setVisible(true); 
    } 

    public void mouseReleased(MouseEvent e) { 
    } 
} 

Répondre

2

Il semble que vous mélangez la peinture AWT et la peinture Swing. Au lieu de cela, remplacez paintComponent(), comme suggéré dans l'exemple ci-dessous. Voir Painting in AWT and Swing pour plus de détails.

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

/** @see http://stackoverflow.com/questions/3898775 */ 
public class MousePanel extends JPanel { 

    private static final int SIZE = 20; 
    Point p = new Point(Short.MAX_VALUE, Short.MAX_VALUE); 

    public MousePanel() { 
     this.setPreferredSize(new Dimension(400, 400)); 
     this.setBackground(Color.yellow); 
     this.addMouseListener(new MouseHandler()); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.black); 
     g.drawOval(p.x - SIZE, p.y - SIZE, SIZE * 2, SIZE * 2); 
    } 

    private final class MouseHandler extends MouseAdapter { 

     @Override 
     public void mousePressed(MouseEvent e) { 
      p = e.getPoint(); 
      repaint(); 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("MousePanel"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new MousePanel().display(); 
      } 
     }); 
    } 
} 

Addendum:

Je ne peux pas comprendre comment faire le code affiché travail avec ce que j'ai ...

Vous pouvez restaurer vos méthodes de souris à la MouseHandler presque mot à mot. La seule différence est le besoin de qualify this, par ex.

@Override 
    public void mouseClicked(MouseEvent e) { 
     int whichButton = e.getButton(); 
     if (whichButton == MouseEvent.BUTTON1) { 
      MousePanel.this.size = 15; 
     } else if (whichButton == MouseEvent.BUTTON3) { 
      MousePanel.this.size = 4; 
     } 
     repaint(); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     MousePanel.this.setBackground(Color.yellow); 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     MousePanel.this.setBackground(Color.black); 
    } 
+0

+1, pour le lien et le code. – camickr

+0

Le programme doit afficher une JFrame qui effectue les opérations suivantes: arrière-plan devient jaune lorsque moust pénètre cadre, fond devient noir lorsque la souris quitte le cadre, Grand cercle au point de clic gauche, petit cercle au pont de clic droit, Je n'arrive pas à comprendre comment faire pour que le code que vous avez posté fonctionne avec ce que je dois faire pour que la dernière pièce soit faite en permettant seulement qu'un cercle soit peint à la fois. – Perd

+0

@Perd: J'ai élaboré ci-dessus. Mon exemple 'étend MouseAdapter', alors que yours' implémente MouseListener', mais l'effet est le même. – trashgod