Очистить нарисованный экран при каждом щелчке мыши? - PullRequest
2 голосов
/ 10 октября 2010

Не могу понять, как показать только один круг.Пытался //g.clearRect(0, 0, 400, 400);но это тоже очищает фон.Также пытался снова залить фон желтым, но это тоже не получилось.Какие-либо предложения?

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) {
    }
}

1 Ответ

2 голосов
/ 10 октября 2010

Похоже, вы смешиваете рисование AWT и Swing. Вместо этого переопределите paintComponent(), как предложено в примере ниже. Подробнее см. Живопись в AWT и Swing .

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

Добавление:

Я не могу понять, как заставить опубликованный вами код работать с тем, что у меня есть ...

Вы можете восстановить свои методы мыши почти до MouseHandler дословно. Единственная разница заключается в необходимости квалификации this, например,

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