当前位置: 代码迷 >> J2SE >> paintComponent方法好奇怪,该如何处理
  详细解决方案

paintComponent方法好奇怪,该如何处理

热度:108   发布时间:2016-04-24 02:14:07.0
paintComponent方法好奇怪
Java code
import javax.swing.SwingUtilities;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.BorderFactory;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseMotionListener;import java.awt.event.MouseMotionAdapter;public class SwingPaintDemo3 {    public static void main(String[] args) {        SwingUtilities.invokeLater(new Runnable() {            public void run() {                createAndShowGUI();            }        });    }    private static void createAndShowGUI() {        System.out.println("Created GUI on EDT? "                + SwingUtilities.isEventDispatchThread());        JFrame f = new JFrame("Swing Paint Demo");        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        f.add(new MyPanel());        f.pack();        f.setVisible(true);    }}class MyPanel extends JPanel {    private int squareX = 50;    private int squareY = 50;    private int squareW = 20;    private int squareH = 20;    public MyPanel() {        setBorder(BorderFactory.createLineBorder(Color.black));        addMouseListener(new MouseAdapter() {            public void mousePressed(MouseEvent e) {                moveSquare(e.getX(), e.getY());            }        });        addMouseMotionListener(new MouseAdapter() {            public void mouseDragged(MouseEvent e) {                moveSquare(e.getX(), e.getY());            }        });    }    private void moveSquare(int x, int y) {        int OFFSET = 1;        if ((squareX != x) || (squareY != y)) {            repaint(squareX, squareY, squareW + OFFSET, squareH + OFFSET);            squareX = x;            squareY = y;            repaint(squareX, squareY, squareW + OFFSET, squareH + OFFSET);        }     }    public Dimension getPreferredSize() {        return new Dimension(250, 200);    }    protected void paintComponent(Graphics g) {        super.paintComponent(g);        g.drawString("This is my custom Panel!", 10, 20);        g.setColor(Color.RED);        g.fillRect(squareX, squareY, squareW, squareH);        g.setColor(Color.BLACK);        g.drawRect(squareX, squareY, squareW, squareH);    }}

直接上了代码 问题是moveSquare方法为什么要调用两次的repaint方法呢? super.paintComponent方法上网查了下说是可以清除所有东西 那moveSquare方法的第一个repaint方法不是多余的了吗? 不解啊。。。。

------解决方案--------------------
我记得是画背景的