每次点击鼠标都清除画面?

时间:2010-10-10 02:35:32

标签: java swing awt paint

似乎无法弄清楚如何只显示一个圆圈。试图//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 个答案:

答案 0 :(得分:2)

看起来你正在混合AWT和Swing绘画。相反,请覆盖paintComponent(),如下例所示。有关详细信息,请参阅Painting in AWT and 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。唯一的区别是需要qualify 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);
    }